Clean up visitor code generation
This commit is contained in:
parent
12ddcdbc87
commit
d3ee4112e3
@ -185,9 +185,8 @@ pub enum Field {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Field {
|
impl Field {
|
||||||
pub fn get_simple_type_visitor(&self) -> TokenStream {
|
pub fn get_simple_type_visitor(&self) -> Ident {
|
||||||
let ident = format_ident!("visit_{}", self.to_string());
|
format_ident!("visit_{}", self.to_string())
|
||||||
quote! {#ident}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
use crate::common::{Field, YaSerdeAttribute, YaSerdeField};
|
use crate::common::{Field, YaSerdeAttribute, YaSerdeField};
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::{Span, TokenStream};
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
use syn::{DataEnum, Fields, Ident};
|
use syn::{DataEnum, Fields, Ident};
|
||||||
|
|
||||||
@ -149,26 +149,25 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream {
|
|||||||
.iter()
|
.iter()
|
||||||
.map(|field| YaSerdeField::new(field.clone()))
|
.map(|field| YaSerdeField::new(field.clone()))
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(idx, field)| {
|
.filter_map(|(idx, field)| {
|
||||||
let visitor_label = Ident::new(&format!("__Visitor_{}", idx), field.get_span());
|
let visitor_label = Ident::new(&format!("__Visitor_{}", idx), field.get_span());
|
||||||
|
|
||||||
let make_visitor =
|
let make_visitor = |visitor: &Ident, field_type: &TokenStream, fn_body: &TokenStream| {
|
||||||
|visitor: &TokenStream, field_type: &TokenStream, fn_body: &TokenStream| {
|
quote! {
|
||||||
Some(quote! {
|
#[allow(non_snake_case, non_camel_case_types)]
|
||||||
#[allow(non_snake_case, non_camel_case_types)]
|
struct #visitor_label;
|
||||||
struct #visitor_label;
|
impl<'de> ::yaserde::Visitor<'de> for #visitor_label {
|
||||||
impl<'de> ::yaserde::Visitor<'de> for #visitor_label {
|
type Value = #field_type;
|
||||||
type Value = #field_type;
|
|
||||||
|
|
||||||
fn #visitor(
|
fn #visitor(
|
||||||
self,
|
self,
|
||||||
v: &::std::primitive::str,
|
v: &::std::primitive::str,
|
||||||
) -> ::std::result::Result<Self::Value, ::std::string::String> {
|
) -> ::std::result::Result<Self::Value, ::std::string::String> {
|
||||||
#fn_body
|
#fn_body
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
};
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let simple_type_visitor = |simple_type: Field| {
|
let simple_type_visitor = |simple_type: Field| {
|
||||||
let visitor = simple_type.get_simple_type_visitor();
|
let visitor = simple_type.get_simple_type_visitor();
|
||||||
@ -189,8 +188,8 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream {
|
|||||||
.map(|s| s.ident.to_string())
|
.map(|s| s.ident.to_string())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
make_visitor(
|
Some(make_visitor(
|
||||||
"e! { visit_str },
|
&Ident::new("visit_str", Span::call_site()),
|
||||||
"e! { #struct_name },
|
"e! { #struct_name },
|
||||||
"e! {
|
"e! {
|
||||||
let content = "<".to_string() + #struct_id + ">" + v + "</" + #struct_id + ">";
|
let content = "<".to_string() + #struct_id + ">" + v + "</" + #struct_id + ">";
|
||||||
@ -198,16 +197,15 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream {
|
|||||||
::yaserde::de::from_str(&content);
|
::yaserde::de::from_str(&content);
|
||||||
value
|
value
|
||||||
},
|
},
|
||||||
)
|
))
|
||||||
}
|
}
|
||||||
Field::FieldOption { data_type } | Field::FieldVec { data_type } => match *data_type {
|
Field::FieldOption { data_type } | Field::FieldVec { data_type } => match *data_type {
|
||||||
Field::FieldStruct { .. } => None,
|
Field::FieldStruct { .. } => None,
|
||||||
simple_type => simple_type_visitor(simple_type),
|
simple_type => Some(simple_type_visitor(simple_type)),
|
||||||
},
|
},
|
||||||
simple_type => simple_type_visitor(simple_type),
|
simple_type => Some(simple_type_visitor(simple_type)),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.filter_map(|f| f)
|
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -229,7 +229,7 @@ pub fn parse(
|
|||||||
let label_name = field.renamed_label_without_namespace();
|
let label_name = field.renamed_label_without_namespace();
|
||||||
let visitor_label = build_visitor_ident(&label_name, field.get_span(), None);
|
let visitor_label = build_visitor_ident(&label_name, field.get_span(), None);
|
||||||
|
|
||||||
let visit = |action: &TokenStream, visitor: &TokenStream, visitor_label: &Ident| {
|
let visit = |action: &TokenStream, visitor: &Ident, visitor_label: &Ident| {
|
||||||
Some(quote! {
|
Some(quote! {
|
||||||
for attr in attributes {
|
for attr in attributes {
|
||||||
if attr.name.local_name == #label_name {
|
if attr.name.local_name == #label_name {
|
||||||
@ -254,7 +254,7 @@ pub fn parse(
|
|||||||
let visit_struct = |struct_name: syn::Path, action: TokenStream| {
|
let visit_struct = |struct_name: syn::Path, action: TokenStream| {
|
||||||
visit(
|
visit(
|
||||||
&action,
|
&action,
|
||||||
"e! { visit_str },
|
&Ident::new("visit_str", Span::call_site()),
|
||||||
&build_visitor_ident(&label_name, field.get_span(), Some(&struct_name)),
|
&build_visitor_ident(&label_name, field.get_span(), Some(&struct_name)),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@ -421,7 +421,7 @@ pub fn parse(
|
|||||||
|
|
||||||
fn build_call_visitor(
|
fn build_call_visitor(
|
||||||
field_type: &TokenStream,
|
field_type: &TokenStream,
|
||||||
visitor: &TokenStream,
|
visitor: &Ident,
|
||||||
action: &TokenStream,
|
action: &TokenStream,
|
||||||
field: &YaSerdeField,
|
field: &YaSerdeField,
|
||||||
root_attributes: &YaSerdeAttribute,
|
root_attributes: &YaSerdeAttribute,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user