Support default attr in deserialize_seq_in_place

This commit is contained in:
David Tolnay
2018-12-10 22:08:13 -08:00
parent 65705e2091
commit 85fbd8793a
+22 -14
View File
@@ -661,7 +661,7 @@ fn deserialize_seq(
}) })
} }
}; };
let value = match *field.attrs.default() { let value_if_none = match *field.attrs.default() {
attr::Default::Default => quote!(_serde::export::Default::default()), attr::Default::Default => quote!(_serde::export::Default::default()),
attr::Default::Path(ref path) => quote!(#path()), attr::Default::Path(ref path) => quote!(#path()),
attr::Default::None => quote!( attr::Default::None => quote!(
@@ -672,7 +672,7 @@ fn deserialize_seq(
let #var = match #visit { let #var = match #visit {
_serde::export::Some(__value) => __value, _serde::export::Some(__value) => __value,
_serde::export::None => { _serde::export::None => {
#value #value_if_none
} }
}; };
}; };
@@ -747,8 +747,16 @@ fn deserialize_seq_in_place(
self.place.#member = #default; self.place.#member = #default;
} }
} else { } else {
let return_invalid_length = quote! { let value_if_none = match *field.attrs.default() {
return _serde::export::Err(_serde::de::Error::invalid_length(#index_in_seq, &#expecting)); attr::Default::Default => quote!(
self.place.#member = _serde::export::Default::default();
),
attr::Default::Path(ref path) => quote!(
self.place.#member = #path();
),
attr::Default::None => quote!(
return _serde::export::Err(_serde::de::Error::invalid_length(#index_in_seq, &#expecting));
),
}; };
let write = match field.attrs.deserialize_with() { let write = match field.attrs.deserialize_with() {
None => { None => {
@@ -756,23 +764,23 @@ fn deserialize_seq_in_place(
if let _serde::export::None = try!(_serde::de::SeqAccess::next_element_seed(&mut __seq, if let _serde::export::None = try!(_serde::de::SeqAccess::next_element_seed(&mut __seq,
_serde::private::de::InPlaceSeed(&mut self.place.#member))) _serde::private::de::InPlaceSeed(&mut self.place.#member)))
{ {
#return_invalid_length #value_if_none
} }
} }
} }
Some(path) => { Some(path) => {
let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path); let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
quote!({ quote!({
#wrapper #wrapper
match try!(_serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)) { match try!(_serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)) {
_serde::export::Some(__wrap) => { _serde::export::Some(__wrap) => {
self.place.#member = __wrap.value; self.place.#member = __wrap.value;
}
_serde::export::None => {
#return_invalid_length
}
} }
}) _serde::export::None => {
#value_if_none
}
}
})
} }
}; };
index_in_seq += 1; index_in_seq += 1;