mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-23 05:58:01 +00:00
Stop generating visit_usize and visit_bytes for FieldVisitor
This commit is contained in:
+11
-83
@@ -1,5 +1,5 @@
|
||||
use syn::{self, aster};
|
||||
use quote::{self, Tokens};
|
||||
use quote::Tokens;
|
||||
|
||||
use bound;
|
||||
use internals::ast::{Body, Field, Item, Style, Variant};
|
||||
@@ -652,38 +652,6 @@ fn deserialize_field_visitor(
|
||||
Some(quote!(__ignore,))
|
||||
};
|
||||
|
||||
let index_field_arms: Vec<_> = field_idents.iter()
|
||||
.enumerate()
|
||||
.map(|(field_index, field_ident)| {
|
||||
quote! {
|
||||
#field_index => { Ok(__Field::#field_ident) }
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let (index_error_msg, unknown_ident) = if is_variant {
|
||||
("expected a variant", aster::id("unknown_variant"))
|
||||
} else {
|
||||
("expected a field", aster::id("unknown_field"))
|
||||
};
|
||||
|
||||
let fallthrough_index_arm_expr = if !is_variant && !item_attrs.deny_unknown_fields() {
|
||||
quote! {
|
||||
Ok(__Field::__ignore)
|
||||
}
|
||||
} else {
|
||||
quote! {
|
||||
Err(_serde::de::Error::invalid_value(#index_error_msg))
|
||||
}
|
||||
};
|
||||
|
||||
let index_body = quote! {
|
||||
match value {
|
||||
#(#index_field_arms)*
|
||||
_ => #fallthrough_index_arm_expr
|
||||
}
|
||||
};
|
||||
|
||||
// Match arms to extract a field from a string
|
||||
let str_field_arms: Vec<_> = field_idents.iter().zip(field_names.iter())
|
||||
.map(|(field_ident, field_name)| {
|
||||
@@ -693,49 +661,18 @@ fn deserialize_field_visitor(
|
||||
})
|
||||
.collect();
|
||||
|
||||
let fallthrough_str_arm_expr = if !is_variant && !item_attrs.deny_unknown_fields() {
|
||||
let fallthrough_str_arm_expr = if is_variant {
|
||||
quote! {
|
||||
Ok(__Field::__ignore)
|
||||
Err(_serde::de::Error::unknown_variant(value))
|
||||
}
|
||||
} else if item_attrs.deny_unknown_fields() {
|
||||
quote! {
|
||||
Err(_serde::de::Error::unknown_field(value))
|
||||
}
|
||||
} else {
|
||||
quote! {
|
||||
Err(_serde::de::Error::#unknown_ident(value))
|
||||
}
|
||||
};
|
||||
|
||||
let str_body = quote! {
|
||||
match value {
|
||||
#(#str_field_arms)*
|
||||
_ => #fallthrough_str_arm_expr
|
||||
}
|
||||
};
|
||||
|
||||
// Match arms to extract a field from a string
|
||||
let bytes_field_arms: Vec<_> = field_idents.iter().zip(field_names.iter())
|
||||
.map(|(field_ident, field_name)| {
|
||||
let bytes_field_name = quote::ByteStr(field_name);
|
||||
quote! {
|
||||
#bytes_field_name => { Ok(__Field::#field_ident) }
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let fallthrough_bytes_arm_expr = if !is_variant && !item_attrs.deny_unknown_fields() {
|
||||
quote! {
|
||||
Ok(__Field::__ignore)
|
||||
}
|
||||
} else {
|
||||
quote!({
|
||||
let value = ::std::string::String::from_utf8_lossy(value);
|
||||
Err(_serde::de::Error::#unknown_ident(&value))
|
||||
})
|
||||
};
|
||||
|
||||
let bytes_body = quote! {
|
||||
match value {
|
||||
#(#bytes_field_arms)*
|
||||
_ => #fallthrough_bytes_arm_expr
|
||||
}
|
||||
};
|
||||
|
||||
quote! {
|
||||
@@ -755,22 +692,13 @@ fn deserialize_field_visitor(
|
||||
impl _serde::de::Visitor for __FieldVisitor {
|
||||
type Value = __Field;
|
||||
|
||||
fn visit_usize<__E>(&mut self, value: usize) -> ::std::result::Result<__Field, __E>
|
||||
where __E: _serde::de::Error
|
||||
{
|
||||
#index_body
|
||||
}
|
||||
|
||||
fn visit_str<__E>(&mut self, value: &str) -> ::std::result::Result<__Field, __E>
|
||||
where __E: _serde::de::Error
|
||||
{
|
||||
#str_body
|
||||
}
|
||||
|
||||
fn visit_bytes<__E>(&mut self, value: &[u8]) -> ::std::result::Result<__Field, __E>
|
||||
where __E: _serde::de::Error
|
||||
{
|
||||
#bytes_body
|
||||
match value {
|
||||
#(#str_field_arms)*
|
||||
_ => #fallthrough_str_arm_expr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user