fix internally tagged enums

This commit is contained in:
Aiden McClelland
2023-09-20 14:52:28 -06:00
parent b589a40a8b
commit b553ff7b53

View File

@@ -462,14 +462,14 @@ fn build_model_enum(base: &DeriveInput, ast: &DataEnum) -> TokenStream {
.attrs .attrs
.iter() .iter()
.filter(|attr| attr.path.is_ident("serde")) .filter(|attr| attr.path.is_ident("serde"))
.filter_map(|attr| { .filter_map(|attr| -> Option<Punctuated<MetaNameValue, Comma>> {
attr.parse_args_with(|s: ParseStream| { attr.parse_args_with(|s: ParseStream| {
Punctuated::<MetaNameValue, Comma>::parse_terminated(s) Punctuated::<MetaNameValue, Comma>::parse_terminated(s)
}) })
.ok() .ok()
}) })
.flatten() .flatten()
.filter_map(|nv| { .filter_map(|nv: MetaNameValue| {
if nv.path.is_ident("tag") { if nv.path.is_ident("tag") {
Some(("tag", nv.lit)) Some(("tag", nv.lit))
} else if nv.path.is_ident("content") { } else if nv.path.is_ident("content") {
@@ -479,6 +479,7 @@ fn build_model_enum(base: &DeriveInput, ast: &DataEnum) -> TokenStream {
} }
}) })
.collect(); .collect();
let mut model_variants = TokenStream::new(); let mut model_variants = TokenStream::new();
let mut ref_model_variants = TokenStream::new(); let mut ref_model_variants = TokenStream::new();
let mut mut_model_variants = TokenStream::new(); let mut mut_model_variants = TokenStream::new();
@@ -563,11 +564,7 @@ fn build_model_enum(base: &DeriveInput, ast: &DataEnum) -> TokenStream {
let variant_accessor = let variant_accessor =
get_accessor(&serde_rename_all, &variant.attrs, variant_name); get_accessor(&serde_rename_all, &variant.attrs, variant_name);
tag_variants.extend(quote_spanned! { variant_name.span() => tag_variants.extend(quote_spanned! { variant_name.span() =>
Some(#variant_accessor) => #match_name::#variant_name(self.transmute(|v| { Some(#variant_accessor) => #match_name::#variant_name(self.transmute(|v| v)),
#[allow(unused_imports)]
use patch_db::value::index::Index;
#variant_accessor.index_into_owned(v).unwrap_or_default()
})),
}); });
tag_variants_unmatch.extend(quote_spanned! { variant_name.span() => tag_variants_unmatch.extend(quote_spanned! { variant_name.span() =>
#match_name::#variant_name(v) => Self::from_value({ #match_name::#variant_name(v) => Self::from_value({
@@ -577,18 +574,10 @@ fn build_model_enum(base: &DeriveInput, ast: &DataEnum) -> TokenStream {
}), }),
}); });
tag_variants_ref.extend(quote_spanned! { variant_name.span() => tag_variants_ref.extend(quote_spanned! { variant_name.span() =>
Some(#variant_accessor) => #match_name_ref::#variant_name(self.transmute_ref(|v| { Some(#variant_accessor) => #match_name_ref::#variant_name(self.transmute_ref(|v| v)),
#[allow(unused_imports)]
use patch_db::value::index::Index;
#variant_accessor.index_into(v).unwrap_or(&patch_db::value::NULL)
})),
}); });
tag_variants_mut.extend(quote_spanned! { variant_name.span() => tag_variants_mut.extend(quote_spanned! { variant_name.span() =>
Some(#variant_accessor) => #match_name_mut::#variant_name(self.transmute_mut(|v| { Some(#variant_accessor) => #match_name_mut::#variant_name(self.transmute_mut(|v| v)),
#[allow(unused_imports)]
use patch_db::value::index::Index;
#variant_accessor.index_or_insert(v)
})),
}); });
} }
( (
@@ -732,6 +721,7 @@ fn build_model_enum(base: &DeriveInput, ast: &DataEnum) -> TokenStream {
} }
} }
#[derive(Debug)]
#vis enum #match_name { #vis enum #match_name {
#model_variants #model_variants
Error(patch_db::Value), Error(patch_db::Value),
@@ -743,6 +733,7 @@ fn build_model_enum(base: &DeriveInput, ast: &DataEnum) -> TokenStream {
} }
} }
#[derive(Debug)]
#vis enum #match_name_ref<'a> { #vis enum #match_name_ref<'a> {
#ref_model_variants #ref_model_variants
Error(&'a patch_db::Value), Error(&'a patch_db::Value),
@@ -754,6 +745,7 @@ fn build_model_enum(base: &DeriveInput, ast: &DataEnum) -> TokenStream {
} }
} }
#[derive(Debug)]
#vis enum #match_name_mut<'a> { #vis enum #match_name_mut<'a> {
#mut_model_variants #mut_model_variants
Error(&'a mut patch_db::Value), Error(&'a mut patch_db::Value),