From 5a0f0e55a7082a50f019bd8a38220f57a09beebf Mon Sep 17 00:00:00 2001 From: Dmitry Samoylov Date: Tue, 4 Feb 2020 17:50:16 +0700 Subject: [PATCH] Remove unneeded Option's and unsafe's --- yaserde_derive/src/de/expand_struct.rs | 1374 +++++++++++------------ yaserde_derive/src/ser/expand_struct.rs | 435 ++++--- 2 files changed, 882 insertions(+), 927 deletions(-) diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index 71d115e..1a5ec7b 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -34,53 +34,53 @@ pub fn parse( let label = &get_value_label(&field.ident); let field_attrs = YaSerdeAttribute::parse(&field.attrs); - match get_field_type(field) { - Some(FieldType::FieldTypeString) => build_default_value( + get_field_type(field).and_then(|field| match field { + FieldType::FieldTypeString => build_default_value( label, "e! {String}, "e! {"".to_string()}, &field_attrs.default, ), - Some(FieldType::FieldTypeBool) => { + FieldType::FieldTypeBool => { build_default_value(label, "e! {bool}, "e! {false}, &field_attrs.default) } - Some(FieldType::FieldTypeI8) => { + FieldType::FieldTypeI8 => { build_default_value(label, "e! {i8}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeU8) => { + FieldType::FieldTypeU8 => { build_default_value(label, "e! {u8}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeI16) => { + FieldType::FieldTypeI16 => { build_default_value(label, "e! {i16}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeU16) => { + FieldType::FieldTypeU16 => { build_default_value(label, "e! {u16}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeI32) => { + FieldType::FieldTypeI32 => { build_default_value(label, "e! {i32}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeU32) => { + FieldType::FieldTypeU32 => { build_default_value(label, "e! {u32}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeI64) => { + FieldType::FieldTypeI64 => { build_default_value(label, "e! {i64}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeU64) => { + FieldType::FieldTypeU64 => { build_default_value(label, "e! {u64}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeF32) => { + FieldType::FieldTypeF32 => { build_default_value(label, "e! {f32}, "e! {0.0}, &field_attrs.default) } - Some(FieldType::FieldTypeF64) => { + FieldType::FieldTypeF64 => { build_default_value(label, "e! {f64}, "e! {0.0}, &field_attrs.default) } - Some(FieldType::FieldTypeStruct { struct_name }) => build_default_value( + FieldType::FieldTypeStruct { struct_name } => build_default_value( label, "e! {#struct_name}, "e! {#struct_name::default()}, &field_attrs.default, ), - Some(FieldType::FieldTypeOption { .. }) => { + FieldType::FieldTypeOption { .. } => { if let Some(d) = &field_attrs.default { let default_function = Ident::new(&d, Span::call_site()); @@ -95,97 +95,90 @@ pub fn parse( }) } } - Some(FieldType::FieldTypeVec { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeBool) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeI8) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeU8) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeI16) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeU16) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeI32) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeU32) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeI64) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeU64) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeF32) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeF64) => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeStruct { ref struct_name }) => build_default_value( - label, - "e! {Vec<#struct_name>}, - "e! {vec![]}, - &field_attrs.default, - ), - Some(&FieldType::FieldTypeOption { .. }) | Some(&FieldType::FieldTypeVec { .. }) => { - unimplemented!(); - } - None => { - unimplemented!(); - } + FieldType::FieldTypeVec { data_type } => match *data_type { + FieldType::FieldTypeString => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeBool => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeI8 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeU8 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeI16 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeU16 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeI32 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeU32 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeI64 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeU64 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeF32 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeF64 => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeStruct { ref struct_name } => build_default_value( + label, + "e! {Vec<#struct_name>}, + "e! {vec![]}, + &field_attrs.default, + ), + FieldType::FieldTypeOption { .. } | FieldType::FieldTypeVec { .. } => { + unimplemented!(); } - } - None => None, - } + }, + }) }) .filter_map(|x| x) .collect(); @@ -201,44 +194,44 @@ pub fn parse( let visitor_label = build_visitor_ident(&label_name, None); - match get_field_type(field) { - Some(FieldType::FieldTypeString) => { + get_field_type(field).and_then(|field| match field { + FieldType::FieldTypeString => { build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) } - Some(FieldType::FieldTypeBool) => { + FieldType::FieldTypeBool => { build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) } - Some(FieldType::FieldTypeI8) => { + FieldType::FieldTypeI8 => { build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) } - Some(FieldType::FieldTypeU8) => { + FieldType::FieldTypeU8 => { build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) } - Some(FieldType::FieldTypeI16) => { + FieldType::FieldTypeI16 => { build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) } - Some(FieldType::FieldTypeU16) => { + FieldType::FieldTypeU16 => { build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) } - Some(FieldType::FieldTypeI32) => { + FieldType::FieldTypeI32 => { build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) } - Some(FieldType::FieldTypeU32) => { + FieldType::FieldTypeU32 => { build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) } - Some(FieldType::FieldTypeI64) => { + FieldType::FieldTypeI64 => { build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) } - Some(FieldType::FieldTypeU64) => { + FieldType::FieldTypeU64 => { build_declare_visitor("e! {u64}, "e! {visit_u64}, &visitor_label) } - Some(FieldType::FieldTypeF32) => { + FieldType::FieldTypeF32 => { build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) } - Some(FieldType::FieldTypeF64) => { + FieldType::FieldTypeF64 => { build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) } - Some(FieldType::FieldTypeStruct { struct_name }) => { + FieldType::FieldTypeStruct { struct_name } => { let struct_id: String = struct_name .segments .iter() @@ -260,120 +253,113 @@ pub fn parse( } }) } - Some(FieldType::FieldTypeOption { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => { - build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) - } - Some(&FieldType::FieldTypeBool) => { - build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) - } - Some(&FieldType::FieldTypeI8) => { - build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) - } - Some(&FieldType::FieldTypeU8) => { - build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) - } - Some(&FieldType::FieldTypeI16) => { - build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) - } - Some(&FieldType::FieldTypeU16) => { - build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) - } - Some(&FieldType::FieldTypeI32) => { - build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) - } - Some(&FieldType::FieldTypeU32) => { - build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) - } - Some(&FieldType::FieldTypeI64) => { - build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) - } - Some(&FieldType::FieldTypeU64) => { - build_declare_visitor("e! {u64}, "e! {visit_u64}, &visitor_label) - } - Some(&FieldType::FieldTypeF32) => { - build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) - } - Some(&FieldType::FieldTypeF64) => { - build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) - } - Some(&FieldType::FieldTypeStruct { ref struct_name }) => { - let struct_ident = Ident::new( - &format!("{}", struct_name.into_token_stream()), - Span::call_site(), - ); - Some(quote! { - #[allow(non_snake_case, non_camel_case_types)] - struct #visitor_label; - impl<'de> Visitor<'de> for #visitor_label { - type Value = #struct_ident; - } - }) - } - _ => { - unimplemented!(); - } + FieldType::FieldTypeOption { data_type } => match *data_type { + FieldType::FieldTypeString => { + build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) } - } - Some(FieldType::FieldTypeVec { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => { - build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) - } - Some(&FieldType::FieldTypeBool) => { - build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) - } - Some(&FieldType::FieldTypeI8) => { - build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) - } - Some(&FieldType::FieldTypeU8) => { - build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) - } - Some(&FieldType::FieldTypeI16) => { - build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) - } - Some(&FieldType::FieldTypeU16) => { - build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) - } - Some(&FieldType::FieldTypeI32) => { - build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) - } - Some(&FieldType::FieldTypeU32) => { - build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) - } - Some(&FieldType::FieldTypeI64) => { - build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) - } - Some(&FieldType::FieldTypeU64) => { - build_declare_visitor("e! {u64}, "e! {visit_u64}, &visitor_label) - } - Some(&FieldType::FieldTypeF32) => { - build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) - } - Some(&FieldType::FieldTypeF64) => { - build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) - } - Some(&FieldType::FieldTypeStruct { ref struct_name }) => { - let struct_ident = Ident::new( - &format!("{}", struct_name.into_token_stream()), - Span::call_site(), - ); - Some(quote! { - #[allow(non_snake_case, non_camel_case_types)] - struct #visitor_label; - impl<'de> Visitor<'de> for #visitor_label { - type Value = #struct_ident; - } - }) - } - _ => None, + FieldType::FieldTypeBool => { + build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) } - } - None => None, - } + FieldType::FieldTypeI8 => { + build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) + } + FieldType::FieldTypeU8 => { + build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) + } + FieldType::FieldTypeI16 => { + build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) + } + FieldType::FieldTypeU16 => { + build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) + } + FieldType::FieldTypeI32 => { + build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) + } + FieldType::FieldTypeU32 => { + build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) + } + FieldType::FieldTypeI64 => { + build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) + } + FieldType::FieldTypeU64 => { + build_declare_visitor("e! {u64}, "e! {visit_u64}, &visitor_label) + } + FieldType::FieldTypeF32 => { + build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) + } + FieldType::FieldTypeF64 => { + build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) + } + FieldType::FieldTypeStruct { ref struct_name } => { + let struct_ident = Ident::new( + &format!("{}", struct_name.into_token_stream()), + Span::call_site(), + ); + Some(quote! { + #[allow(non_snake_case, non_camel_case_types)] + struct #visitor_label; + impl<'de> Visitor<'de> for #visitor_label { + type Value = #struct_ident; + } + }) + } + _ => { + unimplemented!(); + } + }, + FieldType::FieldTypeVec { data_type } => match *data_type { + FieldType::FieldTypeString => { + build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) + } + FieldType::FieldTypeBool => { + build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) + } + FieldType::FieldTypeI8 => { + build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) + } + FieldType::FieldTypeU8 => { + build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) + } + FieldType::FieldTypeI16 => { + build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) + } + FieldType::FieldTypeU16 => { + build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) + } + FieldType::FieldTypeI32 => { + build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) + } + FieldType::FieldTypeU32 => { + build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) + } + FieldType::FieldTypeI64 => { + build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) + } + FieldType::FieldTypeU64 => { + build_declare_visitor("e! {u64}, "e! {visit_u64}, &visitor_label) + } + FieldType::FieldTypeF32 => { + build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) + } + FieldType::FieldTypeF64 => { + build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) + } + FieldType::FieldTypeStruct { ref struct_name } => { + let struct_ident = Ident::new( + &format!("{}", struct_name.into_token_stream()), + Span::call_site(), + ); + Some(quote! { + #[allow(non_snake_case, non_camel_case_types)] + struct #visitor_label; + impl<'de> Visitor<'de> for #visitor_label { + type Value = #struct_ident; + } + }) + } + _ => None, + }, + }) }) .filter_map(|x| x) .collect(); @@ -395,8 +381,8 @@ pub fn parse( .clone() .unwrap_or_else(|| label.as_ref().unwrap().to_string()); - match get_field_type(field) { - Some(FieldType::FieldTypeString) => { + get_field_type(field).and_then(|field| match field { + FieldType::FieldTypeString => { let visitor = Ident::new("visit_str", Span::call_site()); build_call_visitor( "e! {String}, @@ -407,7 +393,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeBool) => { + FieldType::FieldTypeBool => { let visitor = Ident::new("visit_bool", Span::call_site()); build_call_visitor( "e! {bool}, @@ -418,7 +404,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeI8) => { + FieldType::FieldTypeI8 => { let visitor = Ident::new("visit_i8", Span::call_site()); build_call_visitor( "e! {i8}, @@ -429,7 +415,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeU8) => { + FieldType::FieldTypeU8 => { let visitor = Ident::new("visit_u8", Span::call_site()); build_call_visitor( "e! {u8}, @@ -440,7 +426,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeU16) => { + FieldType::FieldTypeU16 => { let visitor = Ident::new("visit_u16", Span::call_site()); build_call_visitor( "e! {u16}, @@ -451,7 +437,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeI16) => { + FieldType::FieldTypeI16 => { let visitor = Ident::new("visit_i16", Span::call_site()); build_call_visitor( "e! {i16}, @@ -462,7 +448,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeU32) => { + FieldType::FieldTypeU32 => { let visitor = Ident::new("visit_u32", Span::call_site()); build_call_visitor( "e! {u32}, @@ -473,7 +459,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeI32) => { + FieldType::FieldTypeI32 => { let visitor = Ident::new("visit_i32", Span::call_site()); build_call_visitor( "e! {i32}, @@ -484,7 +470,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeU64) => { + FieldType::FieldTypeU64 => { let visitor = Ident::new("visit_u64", Span::call_site()); build_call_visitor( "e! {u64}, @@ -495,7 +481,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeI64) => { + FieldType::FieldTypeI64 => { let visitor = Ident::new("visit_i64", Span::call_site()); build_call_visitor( "e! {i64}, @@ -506,7 +492,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeF32) => { + FieldType::FieldTypeF32 => { let visitor = Ident::new("visit_f32", Span::call_site()); build_call_visitor( "e! {f32}, @@ -517,7 +503,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeF64) => { + FieldType::FieldTypeF64 => { let visitor = Ident::new("visit_f64", Span::call_site()); build_call_visitor( "e! {f64}, @@ -528,7 +514,7 @@ pub fn parse( &namespaces, ) } - Some(FieldType::FieldTypeStruct { struct_name }) => Some(quote! { + FieldType::FieldTypeStruct { struct_name } => Some(quote! { #label_name => { reader.set_map_value(); match #struct_name::deserialize(reader) { @@ -542,324 +528,317 @@ pub fn parse( } } }), - Some(FieldType::FieldTypeOption { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => { - let visitor = Ident::new("visit_str", Span::call_site()); - build_call_visitor( - "e! {String}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeBool) => { - let visitor = Ident::new("visit_bool", Span::call_site()); - build_call_visitor( - "e! {bool}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeU8) => { - let visitor = Ident::new("visit_u8", Span::call_site()); - build_call_visitor( - "e! {u8}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeI8) => { - let visitor = Ident::new("visit_i8", Span::call_site()); - build_call_visitor( - "e! {i8}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeU16) => { - let visitor = Ident::new("visit_u16", Span::call_site()); - build_call_visitor( - "e! {u16}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeI16) => { - let visitor = Ident::new("visit_i16", Span::call_site()); - build_call_visitor( - "e! {i16}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeU32) => { - let visitor = Ident::new("visit_u32", Span::call_site()); - build_call_visitor( - "e! {u32}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeI32) => { - let visitor = Ident::new("visit_i32", Span::call_site()); - build_call_visitor( - "e! {i32}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeU64) => { - let visitor = Ident::new("visit_u64", Span::call_site()); - build_call_visitor( - "e! {u64}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeI64) => { - let visitor = Ident::new("visit_i64", Span::call_site()); - build_call_visitor( - "e! {i64}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeF32) => { - let visitor = Ident::new("visit_f32", Span::call_site()); - build_call_visitor( - "e! {f32}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeF64) => { - let visitor = Ident::new("visit_f64", Span::call_site()); - build_call_visitor( - "e! {f64}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeStruct { ref struct_name }) => { - let struct_ident = Ident::new( - &format!("{}", struct_name.into_token_stream()), - Span::call_site(), - ); - Some(quote! { - #label_name => { - reader.set_map_value(); - match #struct_ident::deserialize(reader) { - Ok(parsed_item) => { - #value_label = Some(parsed_item); - let _root = reader.next_event(); - }, - Err(msg) => { - return Err(msg); - }, - } - } - }) - } - _ => unimplemented!(), + FieldType::FieldTypeOption { data_type } => match *data_type { + FieldType::FieldTypeString => { + let visitor = Ident::new("visit_str", Span::call_site()); + build_call_visitor( + "e! {String}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) } - } - Some(FieldType::FieldTypeVec { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => { - let visitor = Ident::new("visit_str", Span::call_site()); - build_call_visitor( - "e! {String}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeBool) => { - let visitor = Ident::new("visit_bool", Span::call_site()); - build_call_visitor( - "e! {bool}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeI8) => { - let visitor = Ident::new("visit_i8", Span::call_site()); - build_call_visitor( - "e! {i8}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeU8) => { - let visitor = Ident::new("visit_u8", Span::call_site()); - build_call_visitor( - "e! {u8}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeI16) => { - let visitor = Ident::new("visit_i16", Span::call_site()); - build_call_visitor( - "e! {i16}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeU16) => { - let visitor = Ident::new("visit_u16", Span::call_site()); - build_call_visitor( - "e! {u16}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeI32) => { - let visitor = Ident::new("visit_i32", Span::call_site()); - build_call_visitor( - "e! {i32}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeU32) => { - let visitor = Ident::new("visit_u32", Span::call_site()); - build_call_visitor( - "e! {u32}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeI64) => { - let visitor = Ident::new("visit_i64", Span::call_site()); - build_call_visitor( - "e! {i64}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeU64) => { - let visitor = Ident::new("visit_u64", Span::call_site()); - build_call_visitor( - "e! {u64}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeF32) => { - let visitor = Ident::new("visit_f32", Span::call_site()); - build_call_visitor( - "e! {f32}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeF64) => { - let visitor = Ident::new("visit_f64", Span::call_site()); - build_call_visitor( - "e! {f64}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - Some(&FieldType::FieldTypeStruct { ref struct_name }) => { - let struct_ident = Ident::new( - &format!("{}", struct_name.into_token_stream()), - Span::call_site(), - ); - Some(quote! { - #label_name => { - reader.set_map_value(); - match #struct_ident::deserialize(reader) { - Ok(parsed_item) => { - #value_label.push(parsed_item); - let _root = reader.next_event(); - }, - Err(msg) => { - return Err(msg); - }, - } - } - }) - } - _ => unimplemented!(), + FieldType::FieldTypeBool => { + let visitor = Ident::new("visit_bool", Span::call_site()); + build_call_visitor( + "e! {bool}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) } - } - None => None, - } + FieldType::FieldTypeU8 => { + let visitor = Ident::new("visit_u8", Span::call_site()); + build_call_visitor( + "e! {u8}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeI8 => { + let visitor = Ident::new("visit_i8", Span::call_site()); + build_call_visitor( + "e! {i8}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeU16 => { + let visitor = Ident::new("visit_u16", Span::call_site()); + build_call_visitor( + "e! {u16}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeI16 => { + let visitor = Ident::new("visit_i16", Span::call_site()); + build_call_visitor( + "e! {i16}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeU32 => { + let visitor = Ident::new("visit_u32", Span::call_site()); + build_call_visitor( + "e! {u32}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeI32 => { + let visitor = Ident::new("visit_i32", Span::call_site()); + build_call_visitor( + "e! {i32}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeU64 => { + let visitor = Ident::new("visit_u64", Span::call_site()); + build_call_visitor( + "e! {u64}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeI64 => { + let visitor = Ident::new("visit_i64", Span::call_site()); + build_call_visitor( + "e! {i64}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeF32 => { + let visitor = Ident::new("visit_f32", Span::call_site()); + build_call_visitor( + "e! {f32}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeF64 => { + let visitor = Ident::new("visit_f64", Span::call_site()); + build_call_visitor( + "e! {f64}, + &visitor, + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeStruct { ref struct_name } => { + let struct_ident = Ident::new( + &format!("{}", struct_name.into_token_stream()), + Span::call_site(), + ); + Some(quote! { + #label_name => { + reader.set_map_value(); + match #struct_ident::deserialize(reader) { + Ok(parsed_item) => { + #value_label = Some(parsed_item); + let _root = reader.next_event(); + }, + Err(msg) => { + return Err(msg); + }, + } + } + }) + } + _ => unimplemented!(), + }, + FieldType::FieldTypeVec { data_type } => match *data_type { + FieldType::FieldTypeString => { + let visitor = Ident::new("visit_str", Span::call_site()); + build_call_visitor( + "e! {String}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeBool => { + let visitor = Ident::new("visit_bool", Span::call_site()); + build_call_visitor( + "e! {bool}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeI8 => { + let visitor = Ident::new("visit_i8", Span::call_site()); + build_call_visitor( + "e! {i8}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeU8 => { + let visitor = Ident::new("visit_u8", Span::call_site()); + build_call_visitor( + "e! {u8}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeI16 => { + let visitor = Ident::new("visit_i16", Span::call_site()); + build_call_visitor( + "e! {i16}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeU16 => { + let visitor = Ident::new("visit_u16", Span::call_site()); + build_call_visitor( + "e! {u16}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeI32 => { + let visitor = Ident::new("visit_i32", Span::call_site()); + build_call_visitor( + "e! {i32}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeU32 => { + let visitor = Ident::new("visit_u32", Span::call_site()); + build_call_visitor( + "e! {u32}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeI64 => { + let visitor = Ident::new("visit_i64", Span::call_site()); + build_call_visitor( + "e! {i64}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeU64 => { + let visitor = Ident::new("visit_u64", Span::call_site()); + build_call_visitor( + "e! {u64}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeF32 => { + let visitor = Ident::new("visit_f32", Span::call_site()); + build_call_visitor( + "e! {f32}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeF64 => { + let visitor = Ident::new("visit_f64", Span::call_site()); + build_call_visitor( + "e! {f64}, + &visitor, + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ) + } + FieldType::FieldTypeStruct { ref struct_name } => { + let struct_ident = Ident::new( + &format!("{}", struct_name.into_token_stream()), + Span::call_site(), + ); + Some(quote! { + #label_name => { + reader.set_map_value(); + match #struct_ident::deserialize(reader) { + Ok(parsed_item) => { + #value_label.push(parsed_item); + let _root = reader.next_event(); + }, + Err(msg) => { + return Err(msg); + }, + } + } + }) + } + _ => unimplemented!(), + }, + }) }) .filter_map(|x| x) .collect(); @@ -881,185 +860,186 @@ pub fn parse( let visitor_label = build_visitor_ident(&label_name, None); - match get_field_type(field) { - Some(FieldType::FieldTypeString) => Some(quote! { + get_field_type(field).and_then(|field| match field { + FieldType::FieldTypeString => Some(quote! { for attr in attributes { if attr.name.local_name == #label_name { #label = attr.value.to_owned(); } } }), - Some(FieldType::FieldTypeBool) => build_call_visitor_for_attribute( + FieldType::FieldTypeBool => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_bool}, &visitor_label, ), - Some(FieldType::FieldTypeI8) => build_call_visitor_for_attribute( + FieldType::FieldTypeI8 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_i8}, &visitor_label, ), - Some(FieldType::FieldTypeU8) => build_call_visitor_for_attribute( + FieldType::FieldTypeU8 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_u8}, &visitor_label, ), - Some(FieldType::FieldTypeI16) => build_call_visitor_for_attribute( + FieldType::FieldTypeI16 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_i16}, &visitor_label, ), - Some(FieldType::FieldTypeU16) => build_call_visitor_for_attribute( + FieldType::FieldTypeU16 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_u16}, &visitor_label, ), - Some(FieldType::FieldTypeI32) => build_call_visitor_for_attribute( + FieldType::FieldTypeI32 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_i32}, &visitor_label, ), - Some(FieldType::FieldTypeU32) => build_call_visitor_for_attribute( + FieldType::FieldTypeU32 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_u32}, &visitor_label, ), - Some(FieldType::FieldTypeI64) => build_call_visitor_for_attribute( + FieldType::FieldTypeI64 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_i64}, &visitor_label, ), - Some(FieldType::FieldTypeU64) => build_call_visitor_for_attribute( + FieldType::FieldTypeU64 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_u64}, &visitor_label, ), - Some(FieldType::FieldTypeF32) => build_call_visitor_for_attribute( + FieldType::FieldTypeF32 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_f32}, &visitor_label, ), - Some(FieldType::FieldTypeF64) => build_call_visitor_for_attribute( + FieldType::FieldTypeF64 => build_call_visitor_for_attribute( label, &label_name, "e! {= value}, "e! {visit_f64}, &visitor_label, ), - Some(FieldType::FieldTypeOption { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_str}, - &visitor_label, - ), - Some(&FieldType::FieldTypeBool) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_bool}, - &visitor_label, - ), - Some(&FieldType::FieldTypeU8) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_u8}, - &visitor_label, - ), - Some(&FieldType::FieldTypeI8) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_i8}, - &visitor_label, - ), - Some(&FieldType::FieldTypeU16) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_u16}, - &visitor_label, - ), - Some(&FieldType::FieldTypeI16) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_i16}, - &visitor_label, - ), - Some(&FieldType::FieldTypeU32) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_u32}, - &visitor_label, - ), - Some(&FieldType::FieldTypeI32) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_i32}, - &visitor_label, - ), - Some(&FieldType::FieldTypeU64) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_u64}, - &visitor_label, - ), - Some(&FieldType::FieldTypeI64) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_i64}, - &visitor_label, - ), - Some(&FieldType::FieldTypeF32) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_f32}, - &visitor_label, - ), - Some(&FieldType::FieldTypeF64) => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_f64}, - &visitor_label, - ), - _ => None, - } - } - Some(FieldType::FieldTypeStruct { struct_name }) => { - let struct_ident = build_visitor_ident( + FieldType::FieldTypeOption { data_type } => match *data_type { + FieldType::FieldTypeString => build_call_visitor_for_attribute( + label, &label_name, - Some(&struct_name.into_token_stream().to_string()), + "e! {= Some(value)}, + "e! {visit_str}, + &visitor_label, + ), + FieldType::FieldTypeBool => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_bool}, + &visitor_label, + ), + FieldType::FieldTypeU8 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_u8}, + &visitor_label, + ), + FieldType::FieldTypeI8 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_i8}, + &visitor_label, + ), + FieldType::FieldTypeU16 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_u16}, + &visitor_label, + ), + FieldType::FieldTypeI16 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_i16}, + &visitor_label, + ), + FieldType::FieldTypeU32 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_u32}, + &visitor_label, + ), + FieldType::FieldTypeI32 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_i32}, + &visitor_label, + ), + FieldType::FieldTypeU64 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_u64}, + &visitor_label, + ), + FieldType::FieldTypeI64 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_i64}, + &visitor_label, + ), + FieldType::FieldTypeF32 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_f32}, + &visitor_label, + ), + FieldType::FieldTypeF64 => build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + "e! {visit_f64}, + &visitor_label, + ), + _ => None, + }, + FieldType::FieldTypeStruct { struct_name } => { + let struct_ident = Ident::new( + &format!( + "__Visitor_{}_{}", + label_name, + struct_name.into_token_stream() + ), + Span::call_site(), ); Some(quote! { @@ -1075,7 +1055,7 @@ pub fn parse( }) } _ => None, - } + }) }) .filter_map(|x| x) .collect(); @@ -1087,71 +1067,70 @@ pub fn parse( let label = &get_value_label(&field.ident); let field_attrs = YaSerdeAttribute::parse(&field.attrs); - match get_field_type(field) { - Some(FieldType::FieldTypeString) => { + get_field_type(field).and_then(|field| match field { + FieldType::FieldTypeString => { build_set_text_to_value(&field_attrs, label, "e! {text_content.to_owned()}) } - Some(FieldType::FieldTypeBool) => build_set_text_to_value( + FieldType::FieldTypeBool => build_set_text_to_value( &field_attrs, label, "e! {bool::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeI8) => build_set_text_to_value( + FieldType::FieldTypeI8 => build_set_text_to_value( &field_attrs, label, "e! {i8::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeU8) => build_set_text_to_value( + FieldType::FieldTypeU8 => build_set_text_to_value( &field_attrs, label, "e! {u8::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeI16) => build_set_text_to_value( + FieldType::FieldTypeI16 => build_set_text_to_value( &field_attrs, label, "e! {i16::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeU16) => build_set_text_to_value( + FieldType::FieldTypeU16 => build_set_text_to_value( &field_attrs, label, "e! {u16::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeI32) => build_set_text_to_value( + FieldType::FieldTypeI32 => build_set_text_to_value( &field_attrs, label, "e! {i32::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeU32) => build_set_text_to_value( + FieldType::FieldTypeU32 => build_set_text_to_value( &field_attrs, label, "e! {u32::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeI64) => build_set_text_to_value( + FieldType::FieldTypeI64 => build_set_text_to_value( &field_attrs, label, "e! {i64::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeU64) => build_set_text_to_value( + FieldType::FieldTypeU64 => build_set_text_to_value( &field_attrs, label, "e! {u64::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeF32) => build_set_text_to_value( + FieldType::FieldTypeF32 => build_set_text_to_value( &field_attrs, label, "e! {f32::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeF64) => build_set_text_to_value( + FieldType::FieldTypeF64 => build_set_text_to_value( &field_attrs, label, "e! {f64::from_str(text_content).unwrap()}, ), - Some(FieldType::FieldTypeStruct { .. }) - | Some(FieldType::FieldTypeOption { .. }) - | Some(FieldType::FieldTypeVec { .. }) - | None => None, - } + FieldType::FieldTypeStruct { .. } + | FieldType::FieldTypeOption { .. } + | FieldType::FieldTypeVec { .. } => None, + }) }) .filter_map(|x| x) .collect(); @@ -1163,13 +1142,9 @@ pub fn parse( let label = &field.ident; let value_label = &get_value_label(&field.ident); - if get_field_type(field).is_some() { - Some(quote! { - #label: #value_label, - }) - } else { - None - } + get_field_type(field).map(|_| { + quote! { #label: #value_label, } + }) }) .filter_map(|x| x) .collect(); @@ -1281,9 +1256,8 @@ fn build_call_visitor( let namespaces_matches: TokenStream = namespaces .iter() .map(|(p, ns)| { - let str_ns = ns.as_str(); if prefix == Some(p.to_string()) { - Some(quote!(#str_ns => {})) + Some(quote!(#ns => {})) } else { None } @@ -1362,13 +1336,9 @@ fn build_set_text_to_value( } fn get_value_label(ident: &Option) -> Option { - match &ident { - Some(ident) => Some(syn::Ident::new( - &format!("__{}_value", ident.to_string()), - ident.span(), - )), - None => None, - } + ident + .clone() + .map(|ident| syn::Ident::new(&format!("__{}_value", ident.to_string()), ident.span())) } fn build_visitor_ident(label: &str, struct_id: Option<&str>) -> Ident { diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index 72ddeed..470151f 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -27,19 +27,19 @@ pub fn serialize( let label_name = build_label_name(&field, &field_attrs); - match get_field_type(field) { - Some(FieldType::FieldTypeString) - | Some(FieldType::FieldTypeBool) - | Some(FieldType::FieldTypeI8) - | Some(FieldType::FieldTypeU8) - | Some(FieldType::FieldTypeI16) - | Some(FieldType::FieldTypeU16) - | Some(FieldType::FieldTypeI32) - | Some(FieldType::FieldTypeU32) - | Some(FieldType::FieldTypeI64) - | Some(FieldType::FieldTypeU64) - | Some(FieldType::FieldTypeF32) - | Some(FieldType::FieldTypeF64) => { + get_field_type(field).and_then(|field| match field { + FieldType::FieldTypeString + | FieldType::FieldTypeBool + | FieldType::FieldTypeI8 + | FieldType::FieldTypeU8 + | FieldType::FieldTypeI16 + | FieldType::FieldTypeU16 + | FieldType::FieldTypeI32 + | FieldType::FieldTypeU32 + | FieldType::FieldTypeI64 + | FieldType::FieldTypeU64 + | FieldType::FieldTypeF32 + | FieldType::FieldTypeF64 => { if let Some(ref d) = field_attrs.default { let default_function = Ident::new(&d, Span::call_site()); Some(quote! { @@ -72,71 +72,49 @@ pub fn serialize( }) } } - Some(FieldType::FieldTypeOption { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => { - if let Some(ref d) = field_attrs.default { - let default_function = Ident::new(&d, Span::call_site()); - Some(quote! { - let struct_start_event = - if self.#label != #default_function() { - if let Some(ref value) = self.#label { - struct_start_event.attr(#label_name, &value) - } else { - struct_start_event - } - } else { - struct_start_event - }; - }) - } else { - Some(quote! { - let struct_start_event = + FieldType::FieldTypeOption { data_type } => match *data_type { + FieldType::FieldTypeString => { + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + Some(quote! { + let struct_start_event = + if self.#label != #default_function() { if let Some(ref value) = self.#label { struct_start_event.attr(#label_name, &value) } else { struct_start_event - }; - }) - } + } + } else { + struct_start_event + }; + }) + } else { + Some(quote! { + let struct_start_event = + if let Some(ref value) = self.#label { + struct_start_event.attr(#label_name, &value) + } else { + struct_start_event + }; + }) } - Some(&FieldType::FieldTypeBool) - | Some(&FieldType::FieldTypeI8) - | Some(&FieldType::FieldTypeU8) - | Some(&FieldType::FieldTypeI16) - | Some(&FieldType::FieldTypeU16) - | Some(&FieldType::FieldTypeI32) - | Some(&FieldType::FieldTypeU32) - | Some(&FieldType::FieldTypeI64) - | Some(&FieldType::FieldTypeU64) - | Some(&FieldType::FieldTypeF32) - | Some(&FieldType::FieldTypeF64) => { - if let Some(ref d) = field_attrs.default { - let default_function = Ident::new(&d, Span::call_site()); - Some(quote! { - let struct_start_event = - if self.#label != #default_function() { - if let Some(ref value) = self.#label { - struct_start_event.attr(#label_name, &*{ - use std::mem; - unsafe { - let content = format!("{}", value); - let ret : &'static str = mem::transmute(&content as &str); - mem::forget(content); - ret - } - }) - } else { - struct_start_event - } - } else { - struct_start_event - }; - }) - } else { - Some(quote! { - let struct_start_event = + } + FieldType::FieldTypeBool + | FieldType::FieldTypeI8 + | FieldType::FieldTypeU8 + | FieldType::FieldTypeI16 + | FieldType::FieldTypeU16 + | FieldType::FieldTypeI32 + | FieldType::FieldTypeU32 + | FieldType::FieldTypeI64 + | FieldType::FieldTypeU64 + | FieldType::FieldTypeF32 + | FieldType::FieldTypeF64 => { + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + Some(quote! { + let struct_start_event = + if self.#label != #default_function() { if let Some(ref value) = self.#label { struct_start_event.attr(#label_name, &*{ use std::mem; @@ -149,38 +127,57 @@ pub fn serialize( }) } else { struct_start_event - }; - }) - } - } - Some(&FieldType::FieldTypeVec { .. }) => { - let item_ident = Ident::new("yas_item", Span::call_site()); - let inner = enclose_formatted_characters(&item_ident, label_name); - - if let Some(ref d) = field_attrs.default { - let default_function = Ident::new(&d, Span::call_site()); - - Some(quote! { - if self.#label != #default_function() { - if let Some(ref yas_list) = self.#label { - for yas_item in yas_list.iter() { - #inner + } + } else { + struct_start_event + }; + }) + } else { + Some(quote! { + let struct_start_event = + if let Some(ref value) = self.#label { + struct_start_event.attr(#label_name, &*{ + use std::mem; + unsafe { + let content = format!("{}", value); + let ret : &'static str = mem::transmute(&content as &str); + mem::forget(content); + ret } + }) + } else { + struct_start_event + }; + }) + } + } + FieldType::FieldTypeVec { .. } => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters(&item_ident, label_name); + + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + + Some(quote! { + if self.#label != #default_function() { + if let Some(ref yas_list) = self.#label { + for yas_item in yas_list.iter() { + #inner } } - }) - } else { - Some(quote! { - for yas_item in &self.#label { - #inner - } - }) - } + } + }) + } else { + Some(quote! { + for yas_item in &self.#label { + #inner + } + }) } - _ => unimplemented!(), } - } - Some(FieldType::FieldTypeStruct { .. }) => { + _ => unimplemented!(), + }, + FieldType::FieldTypeStruct { .. } => { if let Some(ref d) = field_attrs.default { let default_function = Ident::new(&d, Span::call_site()); Some(quote! { @@ -222,7 +219,7 @@ pub fn serialize( } } _ => None, - } + }) }) .filter_map(|x| x) .collect(); @@ -256,157 +253,145 @@ pub fn serialize( let label_name = build_label_name(&field, &field_attrs); - match get_field_type(field) { - Some(FieldType::FieldTypeString) - | Some(FieldType::FieldTypeBool) - | Some(FieldType::FieldTypeI8) - | Some(FieldType::FieldTypeU8) - | Some(FieldType::FieldTypeI16) - | Some(FieldType::FieldTypeU16) - | Some(FieldType::FieldTypeI32) - | Some(FieldType::FieldTypeU32) - | Some(FieldType::FieldTypeI64) - | Some(FieldType::FieldTypeU64) - | Some(FieldType::FieldTypeF32) - | Some(FieldType::FieldTypeF64) => { - serialize_element(label, label_name, &field_attrs.default) - } - Some(FieldType::FieldTypeOption { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) - | Some(&FieldType::FieldTypeBool) - | Some(&FieldType::FieldTypeI8) - | Some(&FieldType::FieldTypeU8) - | Some(&FieldType::FieldTypeI16) - | Some(&FieldType::FieldTypeU16) - | Some(&FieldType::FieldTypeI32) - | Some(&FieldType::FieldTypeU32) - | Some(&FieldType::FieldTypeI64) - | Some(&FieldType::FieldTypeU64) - | Some(&FieldType::FieldTypeF32) - | Some(&FieldType::FieldTypeF64) => { - let item_ident = Ident::new("yas_item", Span::call_site()); - let inner = enclose_formatted_characters_for_value(&item_ident, label_name); + get_field_type(field).and_then(|field| match field { + FieldType::FieldTypeString + | FieldType::FieldTypeBool + | FieldType::FieldTypeI8 + | FieldType::FieldTypeU8 + | FieldType::FieldTypeI16 + | FieldType::FieldTypeU16 + | FieldType::FieldTypeI32 + | FieldType::FieldTypeU32 + | FieldType::FieldTypeI64 + | FieldType::FieldTypeU64 + | FieldType::FieldTypeF32 + | FieldType::FieldTypeF64 => serialize_element(label, label_name, &field_attrs.default), + FieldType::FieldTypeOption { data_type } => match *data_type { + FieldType::FieldTypeString + | FieldType::FieldTypeBool + | FieldType::FieldTypeI8 + | FieldType::FieldTypeU8 + | FieldType::FieldTypeI16 + | FieldType::FieldTypeU16 + | FieldType::FieldTypeI32 + | FieldType::FieldTypeU32 + | FieldType::FieldTypeI64 + | FieldType::FieldTypeU64 + | FieldType::FieldTypeF32 + | FieldType::FieldTypeF64 => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters_for_value(&item_ident, label_name); - if let Some(ref d) = field_attrs.default { - let default_function = Ident::new(&d, Span::call_site()); + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); - Some(quote! { - if self.#label != #default_function() { - if let Some(ref yas_item) = self.#label { - #inner - } - } - }) - } else { - Some(quote! { + Some(quote! { + if self.#label != #default_function() { if let Some(ref yas_item) = self.#label { #inner } - }) - } + } + }) + } else { + Some(quote! { + if let Some(ref yas_item) = self.#label { + #inner + } + }) } - Some(&FieldType::FieldTypeVec { .. }) => { - let item_ident = Ident::new("yas_item", Span::call_site()); - let inner = enclose_formatted_characters_for_value(&item_ident, label_name); + } + FieldType::FieldTypeVec { .. } => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters_for_value(&item_ident, label_name); - if let Some(ref d) = field_attrs.default { - let default_function = Ident::new(&d, Span::call_site()); + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); - Some(quote! { - if self.#label != #default_function() { - if let Some(ref yas_items) = &self.#label { - for yas_item in yas_items.iter() { - #inner - } - } - } - }) - } else { - Some(quote! { + Some(quote! { + if self.#label != #default_function() { if let Some(ref yas_items) = &self.#label { for yas_item in yas_items.iter() { #inner } } - }) - } + } + }) + } else { + Some(quote! { + if let Some(ref yas_items) = &self.#label { + for yas_item in yas_items.iter() { + #inner + } + } + }) } - Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { - if let Some(ref item) = &self.#label { - writer.set_start_event_name(Some(#label_name.to_string())); - writer.set_skip_start_end(false); - item.serialize(writer)?; - } - }), - _ => unimplemented!(), } - } - Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { + FieldType::FieldTypeStruct { .. } => Some(quote! { + if let Some(ref item) = &self.#label { + writer.set_start_event_name(Some(#label_name.to_string())); + writer.set_skip_start_end(false); + item.serialize(writer)?; + } + }), + _ => unimplemented!(), + }, + FieldType::FieldTypeStruct { .. } => Some(quote! { writer.set_start_event_name(Some(#label_name.to_string())); writer.set_skip_start_end(false); self.#label.serialize(writer)?; }), - Some(FieldType::FieldTypeVec { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => { - let item_ident = Ident::new("yas_item", Span::call_site()); - let inner = enclose_formatted_characters_for_value(&item_ident, label_name); + FieldType::FieldTypeVec { data_type } => match *data_type { + FieldType::FieldTypeString => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters_for_value(&item_ident, label_name); - Some(quote! { - for yas_item in &self.#label { - #inner - } - }) - } - Some(&FieldType::FieldTypeBool) - | Some(&FieldType::FieldTypeI8) - | Some(&FieldType::FieldTypeU8) - | Some(&FieldType::FieldTypeI16) - | Some(&FieldType::FieldTypeU16) - | Some(&FieldType::FieldTypeI32) - | Some(&FieldType::FieldTypeU32) - | Some(&FieldType::FieldTypeI64) - | Some(&FieldType::FieldTypeU64) - | Some(&FieldType::FieldTypeF32) - | Some(&FieldType::FieldTypeF64) => { - let item_ident = Ident::new("yas_item", Span::call_site()); - let inner = enclose_formatted_characters_for_value(&item_ident, label_name); - - Some(quote! { - for yas_item in &self.#label { - #inner - } - }) - } - Some(&FieldType::FieldTypeOption { .. }) => Some(quote! { - for item in &self.#label { - if let Some(value) = item { - writer.set_start_event_name(None); - writer.set_skip_start_end(false); - value.serialize(writer)?; - } + Some(quote! { + for yas_item in &self.#label { + #inner } - }), - Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { - for item in &self.#label { + }) + } + FieldType::FieldTypeBool + | FieldType::FieldTypeI8 + | FieldType::FieldTypeU8 + | FieldType::FieldTypeI16 + | FieldType::FieldTypeU16 + | FieldType::FieldTypeI32 + | FieldType::FieldTypeU32 + | FieldType::FieldTypeI64 + | FieldType::FieldTypeU64 + | FieldType::FieldTypeF32 + | FieldType::FieldTypeF64 => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters_for_value(&item_ident, label_name); + + Some(quote! { + for yas_item in &self.#label { + #inner + } + }) + } + FieldType::FieldTypeOption { .. } => Some(quote! { + for item in &self.#label { + if let Some(value) = item { writer.set_start_event_name(None); writer.set_skip_start_end(false); - item.serialize(writer)?; + value.serialize(writer)?; } - }), - Some(&FieldType::FieldTypeVec { .. }) => { - unimplemented!(); } - None => { - unimplemented!(); + }), + FieldType::FieldTypeStruct { .. } => Some(quote! { + for item in &self.#label { + writer.set_start_event_name(None); + writer.set_skip_start_end(false); + item.serialize(writer)?; } + }), + FieldType::FieldTypeVec { .. } => { + unimplemented!(); } - } - None => None, - } + }, + }) }) .filter_map(|x| x) .collect();