Skip to content

Commit

Permalink
fixes #191 - Fix Option::reference
Browse files Browse the repository at this point in the history
+ also clean up some of the impls
  • Loading branch information
oscartbeaumont committed Dec 24, 2023
1 parent cab26b1 commit d3c7476
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 24 deletions.
100 changes: 76 additions & 24 deletions src/type/impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,19 @@ const _: () = {
};

impl<'a> Type for &'a str {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
String::inline(type_map, generics)
}
impl_passthrough!(String);
}

impl<'a, T: Type + 'static> Type for &'a T {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
T::inline(type_map, generics)
}
impl_passthrough!(T);
}

impl<T: Type> Type for [T] {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
T::inline(type_map, generics)
}
impl_passthrough!(T);
}

impl<'a, T: ?Sized + ToOwned + Type + 'static> Type for std::borrow::Cow<'a, T> {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
T::inline(type_map, generics)
}
impl_passthrough!(T);
}

use std::ffi::*;
Expand Down Expand Up @@ -115,9 +107,7 @@ impl_for_list!(
);

impl<'a, T: Type> Type for &'a [T] {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
<Vec<T>>::inline(type_map, generics)
}
impl_passthrough!(Vec<T>);
}

impl<const N: usize, T: Type> Type for [T; N] {
Expand Down Expand Up @@ -159,6 +149,17 @@ impl<T: Type> Type for Option<T> {
.unwrap_or_else(|| T::inline(type_map, generics)),
))
}

fn reference(type_map: &mut TypeMap, generics: &[DataType]) -> Reference {
Reference {
inner: DataType::Nullable(Box::new(
generics
.get(0)
.cloned()
.unwrap_or_else(|| T::reference(type_map, generics).inner),
)),
}
}
}

impl<T: Type, E: Type> Type for std::result::Result<T, E> {
Expand All @@ -168,6 +169,15 @@ impl<T: Type, E: Type> Type for std::result::Result<T, E> {
E::inline(type_map, generics),
)))
}

fn reference(type_map: &mut TypeMap, generics: &[DataType]) -> Reference {
Reference {
inner: DataType::Result(Box::new((
T::reference(type_map, generics).inner,
E::reference(type_map, generics).inner,
))),
}
}
}

impl<T> Type for std::marker::PhantomData<T> {
Expand Down Expand Up @@ -219,9 +229,7 @@ impl<T: Type> Type for std::ops::Range<T> {
}

impl<T: Type> Type for std::ops::RangeInclusive<T> {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
std::ops::Range::<T>::inline(type_map, generics) // Yeah Serde are cringe
}
impl_passthrough!(std::ops::Range<T>); // Yeah Serde are cringe
}

impl_for_map!(HashMap<K, V> as "HashMap");
Expand Down Expand Up @@ -483,16 +491,12 @@ const _: () = {
);

impl<T: TimeZone> Type for DateTime<T> {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
String::inline(type_map, generics)
}
impl_passthrough!(String);
}

#[allow(deprecated)]
impl<T: TimeZone> Type for Date<T> {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
String::inline(type_map, generics)
}
impl_passthrough!(String);
}
};

Expand Down Expand Up @@ -688,6 +692,54 @@ impl<L: Type, R: Type> Type for either::Either<L, R> {
generics: vec![],
})
}

fn reference(type_map: &mut TypeMap, generics: &[DataType]) -> Reference {
Reference {
inner: DataType::Enum(EnumType {
name: "Either".into(),
sid: None,
repr: EnumRepr::Untagged,
skip_bigint_checks: false,
variants: vec![
(
"Left".into(),
EnumVariant {
skip: false,
docs: Cow::Borrowed(""),
deprecated: None,
inner: EnumVariants::Unnamed(UnnamedFields {
fields: vec![Field {
optional: false,
flatten: false,
deprecated: None,
docs: Cow::Borrowed(""),
ty: Some(L::reference(type_map, generics).inner),
}],
}),
},
),
(
"Right".into(),
EnumVariant {
skip: false,
docs: Cow::Borrowed(""),
deprecated: None,
inner: EnumVariants::Unnamed(UnnamedFields {
fields: vec![Field {
optional: false,
flatten: false,
deprecated: None,
docs: Cow::Borrowed(""),
ty: Some(R::reference(type_map, generics).inner),
}],
}),
},
),
],
generics: vec![],
}),
}
}
}

#[cfg(feature = "bevy_ecs")]
Expand Down
12 changes: 12 additions & 0 deletions src/type/macros.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
macro_rules! impl_passthrough {
($t:ty) => {
fn inline(type_map: &mut TypeMap, generics: &[DataType]) -> DataType {
<$t>::inline(type_map, generics)
}

fn reference(type_map: &mut TypeMap, generics: &[DataType]) -> Reference {
<$t>::reference(type_map, generics)
}
};
}

macro_rules! impl_primitives {
($($i:ident)+) => {$(
impl Type for $i {
Expand Down

0 comments on commit d3c7476

Please sign in to comment.