Adressed concerns raised by @oli-obk.

Specifically:
 - Change identation in `de.rs`.
 - Make `attr::Field` take a `attr::Default` as opposed to the entire parent `attr::Container`.
This commit is contained in:
Jeroen Bollen
2017-12-08 15:13:05 +01:00
parent c887a0b472
commit aa86b04714
3 changed files with 23 additions and 20 deletions
+8 -8
View File
@@ -451,15 +451,15 @@ fn deserialize_seq(
attr::Default::Default => { attr::Default::Default => {
Some( Some(
quote!( quote!(
let __default: Self::Value = _serde::export::Default::default(); let __default: Self::Value = _serde::export::Default::default();
), ),
) )
} }
attr::Default::Path(ref path) => { attr::Default::Path(ref path) => {
Some( Some(
quote!( quote!(
let __default: Self::Value = #path(); let __default: Self::Value = #path();
), ),
) )
} }
attr::Default::None => { attr::Default::None => {
@@ -1724,15 +1724,15 @@ fn deserialize_map(
attr::Default::Default => { attr::Default::Default => {
Some( Some(
quote!( quote!(
let __default: Self::Value = _serde::export::Default::default(); let __default: Self::Value = _serde::export::Default::default();
), ),
) )
} }
attr::Default::Path(ref path) => { attr::Default::Path(ref path) => {
Some( Some(
quote!( quote!(
let __default: Self::Value = #path(); let __default: Self::Value = #path();
), ),
) )
} }
attr::Default::None => { attr::Default::None => {
+13 -10
View File
@@ -49,9 +49,11 @@ impl<'a> Container<'a> {
let attrs = attr::Container::from_ast(cx, item); let attrs = attr::Container::from_ast(cx, item);
let mut body = match item.body { let mut body = match item.body {
syn::Body::Enum(ref variants) => Body::Enum(enum_from_ast(cx, variants, &attrs)), syn::Body::Enum(ref variants) => {
Body::Enum(enum_from_ast(cx, variants, &attrs.default()))
}
syn::Body::Struct(ref variant_data) => { syn::Body::Struct(ref variant_data) => {
let (style, fields) = struct_from_ast(cx, variant_data, None, &attrs); let (style, fields) = struct_from_ast(cx, variant_data, None, &attrs.default());
Body::Struct(style, fields) Body::Struct(style, fields)
} }
}; };
@@ -101,13 +103,14 @@ impl<'a> Body<'a> {
fn enum_from_ast<'a>( fn enum_from_ast<'a>(
cx: &Ctxt, cx: &Ctxt,
variants: &'a [syn::Variant], variants: &'a [syn::Variant],
container: &attr::Container, container_default: &attr::Default,
) -> Vec<Variant<'a>> { ) -> Vec<Variant<'a>> {
variants variants
.iter() .iter()
.map(|variant| { .map(|variant| {
let attrs = attr::Variant::from_ast(cx, variant); let attrs = attr::Variant::from_ast(cx, variant);
let (style, fields) = struct_from_ast(cx, &variant.data, Some(&attrs), container); let (style, fields) =
struct_from_ast(cx, &variant.data, Some(&attrs), container_default);
Variant { Variant {
ident: variant.ident.clone(), ident: variant.ident.clone(),
attrs: attrs, attrs: attrs,
@@ -122,18 +125,18 @@ fn struct_from_ast<'a>(
cx: &Ctxt, cx: &Ctxt,
data: &'a syn::VariantData, data: &'a syn::VariantData,
attrs: Option<&attr::Variant>, attrs: Option<&attr::Variant>,
container: &attr::Container, container_default: &attr::Default,
) -> (Style, Vec<Field<'a>>) { ) -> (Style, Vec<Field<'a>>) {
match *data { match *data {
syn::VariantData::Struct(ref fields) => { syn::VariantData::Struct(ref fields) => {
(Style::Struct, fields_from_ast(cx, fields, attrs, container)) (Style::Struct, fields_from_ast(cx, fields, attrs, container_default))
} }
syn::VariantData::Tuple(ref fields) if fields.len() == 1 => ( syn::VariantData::Tuple(ref fields) if fields.len() == 1 => (
Style::Newtype, Style::Newtype,
fields_from_ast(cx, fields, attrs, container), fields_from_ast(cx, fields, attrs, container_default),
), ),
syn::VariantData::Tuple(ref fields) => { syn::VariantData::Tuple(ref fields) => {
(Style::Tuple, fields_from_ast(cx, fields, attrs, container)) (Style::Tuple, fields_from_ast(cx, fields, attrs, container_default))
} }
syn::VariantData::Unit => (Style::Unit, Vec::new()), syn::VariantData::Unit => (Style::Unit, Vec::new()),
} }
@@ -143,7 +146,7 @@ fn fields_from_ast<'a>(
cx: &Ctxt, cx: &Ctxt,
fields: &'a [syn::Field], fields: &'a [syn::Field],
attrs: Option<&attr::Variant>, attrs: Option<&attr::Variant>,
container: &attr::Container, container_default: &attr::Default,
) -> Vec<Field<'a>> { ) -> Vec<Field<'a>> {
fields fields
.iter() .iter()
@@ -152,7 +155,7 @@ fn fields_from_ast<'a>(
|(i, field)| { |(i, field)| {
Field { Field {
ident: field.ident.clone(), ident: field.ident.clone(),
attrs: attr::Field::from_ast(cx, i, field, attrs, container), attrs: attr::Field::from_ast(cx, i, field, attrs, container_default),
ty: &field.ty, ty: &field.ty,
} }
}, },
+2 -2
View File
@@ -719,7 +719,7 @@ impl Field {
index: usize, index: usize,
field: &syn::Field, field: &syn::Field,
attrs: Option<&Variant>, attrs: Option<&Variant>,
container: &Container, container_default: &Default,
) -> Self { ) -> Self {
let mut ser_name = Attr::none(cx, "rename"); let mut ser_name = Attr::none(cx, "rename");
let mut de_name = Attr::none(cx, "rename"); let mut de_name = Attr::none(cx, "rename");
@@ -890,7 +890,7 @@ impl Field {
// Is skip_deserializing, initialize the field to Default::default() unless a different // Is skip_deserializing, initialize the field to Default::default() unless a different
// default is specified by `#[serde(default = "...")]` on ourselves or our container (e.g. // default is specified by `#[serde(default = "...")]` on ourselves or our container (e.g.
// the struct we are in). // the struct we are in).
if container.default == Default::None && skip_deserializing.0.value.is_some() { if container_default == &Default::None && skip_deserializing.0.value.is_some() {
default.set_if_none(Default::Default); default.set_if_none(Default::Default);
} }