Reduce code duplication when handling simple types
This commit is contained in:
parent
5a0f0e55a7
commit
65838ced80
@ -135,23 +135,23 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream {
|
|||||||
.map(|(idx, field)| {
|
.map(|(idx, field)| {
|
||||||
let visitor_label = Ident::new(&format!("__Visitor_{}", idx), Span::call_site());
|
let visitor_label = Ident::new(&format!("__Visitor_{}", idx), Span::call_site());
|
||||||
|
|
||||||
let make_visitor =
|
let make_visitor = |visitor: &Ident, field_type: &TokenStream, fn_body: &TokenStream| {
|
||||||
|visitor: &TokenStream, field_type: &TokenStream, fn_body: &TokenStream| {
|
Some(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> Visitor<'de> for #visitor_label {
|
||||||
impl<'de> Visitor<'de> for #visitor_label {
|
type Value = #field_type;
|
||||||
type Value = #field_type;
|
|
||||||
|
|
||||||
fn #visitor(self, v: &str) -> Result<Self::Value, String> {
|
fn #visitor(self, v: &str) -> Result<Self::Value, String> {
|
||||||
#fn_body
|
#fn_body
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
};
|
})
|
||||||
|
};
|
||||||
|
|
||||||
let simple_type_visitor = |simple_type| {
|
let simple_type_visitor = |simple_type| {
|
||||||
let (field_type, visitor) = convert_simple_type(simple_type);
|
let field_type = get_simple_type_token(&simple_type);
|
||||||
|
let visitor = get_simple_type_visitor(&simple_type);
|
||||||
|
|
||||||
make_visitor(
|
make_visitor(
|
||||||
&visitor,
|
&visitor,
|
||||||
@ -169,7 +169,7 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
make_visitor(
|
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 + ">";
|
||||||
@ -203,7 +203,8 @@ fn build_unnamed_visitor_calls(
|
|||||||
let visitor_label = Ident::new(&format!("__Visitor_{}", idx), Span::call_site());
|
let visitor_label = Ident::new(&format!("__Visitor_{}", idx), Span::call_site());
|
||||||
|
|
||||||
let call_simple_type_visitor = |simple_type, action| {
|
let call_simple_type_visitor = |simple_type, action| {
|
||||||
let (field_type, visitor) = convert_simple_type(simple_type);
|
let field_type = get_simple_type_token(&simple_type);
|
||||||
|
let visitor = get_simple_type_visitor(&simple_type);
|
||||||
|
|
||||||
let label_name = format!("field_{}", idx);
|
let label_name = format!("field_{}", idx);
|
||||||
|
|
||||||
@ -288,21 +289,3 @@ fn build_unnamed_visitor_calls(
|
|||||||
.filter_map(|f| f)
|
.filter_map(|f| f)
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn convert_simple_type(simple_type: FieldType) -> (TokenStream, TokenStream) {
|
|
||||||
match simple_type {
|
|
||||||
FieldType::FieldTypeString => (quote! {String}, quote! {visit_str}),
|
|
||||||
FieldType::FieldTypeBool => (quote! {bool}, quote! {visit_bool}),
|
|
||||||
FieldType::FieldTypeU8 => (quote! {u8}, quote! {visit_u8}),
|
|
||||||
FieldType::FieldTypeI8 => (quote! {i8}, quote! {visit_i8}),
|
|
||||||
FieldType::FieldTypeU16 => (quote! {u16}, quote! {visit_u16}),
|
|
||||||
FieldType::FieldTypeI16 => (quote! {i16}, quote! {visit_i16}),
|
|
||||||
FieldType::FieldTypeU32 => (quote! {u32}, quote! {visit_u32}),
|
|
||||||
FieldType::FieldTypeI32 => (quote! {i32}, quote! {visit_i32}),
|
|
||||||
FieldType::FieldTypeU64 => (quote! {u64}, quote! {visit_u64}),
|
|
||||||
FieldType::FieldTypeI64 => (quote! {i64}, quote! {visit_i64}),
|
|
||||||
FieldType::FieldTypeF32 => (quote! {f32}, quote! {visit_f32}),
|
|
||||||
FieldType::FieldTypeF64 => (quote! {f64}, quote! {visit_f64}),
|
|
||||||
_ => panic!("Not a simple type: {:?}", simple_type),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -73,3 +73,30 @@ fn get_sub_type(t: &syn::PathSegment) -> Option<syn::PathSegment> {
|
|||||||
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_simple_type_token(field_type: &FieldType) -> proc_macro2::TokenStream {
|
||||||
|
match field_type {
|
||||||
|
FieldType::FieldTypeString => quote! {String},
|
||||||
|
FieldType::FieldTypeBool => quote! {bool},
|
||||||
|
FieldType::FieldTypeI8 => quote! {i8},
|
||||||
|
FieldType::FieldTypeU8 => quote! {u8},
|
||||||
|
FieldType::FieldTypeI16 => quote! {i16},
|
||||||
|
FieldType::FieldTypeU16 => quote! {u16},
|
||||||
|
FieldType::FieldTypeI32 => quote! {i32},
|
||||||
|
FieldType::FieldTypeU32 => quote! {u32},
|
||||||
|
FieldType::FieldTypeI64 => quote! {i64},
|
||||||
|
FieldType::FieldTypeU64 => quote! {u64},
|
||||||
|
FieldType::FieldTypeF32 => quote! {f32},
|
||||||
|
FieldType::FieldTypeF64 => quote! {f64},
|
||||||
|
_ => panic!("Not a simple type: {:?}", field_type),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_simple_type_visitor(field_type: &FieldType) -> syn::Ident {
|
||||||
|
format_ident!(
|
||||||
|
"visit_{}",
|
||||||
|
get_simple_type_token(field_type)
|
||||||
|
.to_string()
|
||||||
|
.replace("String", "str")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user