mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-14 14:01:02 +00:00
Keep deserialize aliases as a sorted set
This commit is contained in:
@@ -2001,7 +2001,7 @@ fn deserialize_untagged_newtype_variant(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_generated_identifier(
|
fn deserialize_generated_identifier(
|
||||||
fields: &[(&str, Ident, &[String])],
|
fields: &[(&str, Ident, &BTreeSet<String>)],
|
||||||
cattrs: &attr::Container,
|
cattrs: &attr::Container,
|
||||||
is_variant: bool,
|
is_variant: bool,
|
||||||
other_idx: Option<usize>,
|
other_idx: Option<usize>,
|
||||||
@@ -2187,7 +2187,7 @@ fn deserialize_custom_identifier(
|
|||||||
|
|
||||||
fn deserialize_identifier(
|
fn deserialize_identifier(
|
||||||
this_value: &TokenStream,
|
this_value: &TokenStream,
|
||||||
fields: &[(&str, Ident, &[String])],
|
fields: &[(&str, Ident, &BTreeSet<String>)],
|
||||||
is_variant: bool,
|
is_variant: bool,
|
||||||
fallthrough: Option<TokenStream>,
|
fallthrough: Option<TokenStream>,
|
||||||
fallthrough_borrowed: Option<TokenStream>,
|
fallthrough_borrowed: Option<TokenStream>,
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ pub struct Name {
|
|||||||
serialize_renamed: bool,
|
serialize_renamed: bool,
|
||||||
deserialize: String,
|
deserialize: String,
|
||||||
deserialize_renamed: bool,
|
deserialize_renamed: bool,
|
||||||
deserialize_aliases: Vec<String>,
|
deserialize_aliases: BTreeSet<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unraw(ident: &Ident) -> String {
|
fn unraw(ident: &Ident) -> String {
|
||||||
@@ -148,16 +148,12 @@ impl Name {
|
|||||||
de_name: Attr<String>,
|
de_name: Attr<String>,
|
||||||
de_aliases: Option<VecAttr<String>>,
|
de_aliases: Option<VecAttr<String>>,
|
||||||
) -> Name {
|
) -> Name {
|
||||||
let deserialize_aliases = match de_aliases {
|
let mut alias_set = BTreeSet::new();
|
||||||
Some(de_aliases) => {
|
if let Some(de_aliases) = de_aliases {
|
||||||
let mut alias_list = BTreeSet::new();
|
for alias_name in de_aliases.get() {
|
||||||
for alias_name in de_aliases.get() {
|
alias_set.insert(alias_name);
|
||||||
alias_list.insert(alias_name);
|
|
||||||
}
|
|
||||||
alias_list.into_iter().collect()
|
|
||||||
}
|
}
|
||||||
None => Vec::new(),
|
}
|
||||||
};
|
|
||||||
|
|
||||||
let ser_name = ser_name.get();
|
let ser_name = ser_name.get();
|
||||||
let ser_renamed = ser_name.is_some();
|
let ser_renamed = ser_name.is_some();
|
||||||
@@ -168,7 +164,7 @@ impl Name {
|
|||||||
serialize_renamed: ser_renamed,
|
serialize_renamed: ser_renamed,
|
||||||
deserialize: de_name.unwrap_or(source_name),
|
deserialize: de_name.unwrap_or(source_name),
|
||||||
deserialize_renamed: de_renamed,
|
deserialize_renamed: de_renamed,
|
||||||
deserialize_aliases,
|
deserialize_aliases: alias_set,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,23 +178,9 @@ impl Name {
|
|||||||
&self.deserialize
|
&self.deserialize
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_aliases(&self) -> &[String] {
|
fn deserialize_aliases(&self) -> &BTreeSet<String> {
|
||||||
&self.deserialize_aliases
|
&self.deserialize_aliases
|
||||||
}
|
}
|
||||||
|
|
||||||
fn insert_deserialize_name_into_aliases(&mut self) {
|
|
||||||
// `deserialize_aliases` was constructed from a BTreeSet, so it is
|
|
||||||
// sorted and does not contain duplicates.
|
|
||||||
//
|
|
||||||
// In `Name::from_attrs` it's too early to insert the field's real name
|
|
||||||
// because rename_all rules have not yet gotten applied at that point.
|
|
||||||
match self.deserialize_aliases.binary_search(&self.deserialize) {
|
|
||||||
Ok(_) => {} // already present
|
|
||||||
Err(pos) => self
|
|
||||||
.deserialize_aliases
|
|
||||||
.insert(pos, self.deserialize.clone()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
@@ -986,7 +968,7 @@ impl Variant {
|
|||||||
&self.name
|
&self.name
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn aliases(&self) -> &[String] {
|
pub fn aliases(&self) -> &BTreeSet<String> {
|
||||||
self.name.deserialize_aliases()
|
self.name.deserialize_aliases()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -997,7 +979,9 @@ impl Variant {
|
|||||||
if !self.name.deserialize_renamed {
|
if !self.name.deserialize_renamed {
|
||||||
self.name.deserialize = rules.deserialize.apply_to_variant(&self.name.deserialize);
|
self.name.deserialize = rules.deserialize.apply_to_variant(&self.name.deserialize);
|
||||||
}
|
}
|
||||||
self.name.insert_deserialize_name_into_aliases();
|
self.name
|
||||||
|
.deserialize_aliases
|
||||||
|
.insert(self.name.deserialize.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn rename_all_rules(&self) -> RenameAllRules {
|
pub fn rename_all_rules(&self) -> RenameAllRules {
|
||||||
@@ -1326,7 +1310,7 @@ impl Field {
|
|||||||
&self.name
|
&self.name
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn aliases(&self) -> &[String] {
|
pub fn aliases(&self) -> &BTreeSet<String> {
|
||||||
self.name.deserialize_aliases()
|
self.name.deserialize_aliases()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1337,7 +1321,9 @@ impl Field {
|
|||||||
if !self.name.deserialize_renamed {
|
if !self.name.deserialize_renamed {
|
||||||
self.name.deserialize = rules.deserialize.apply_to_field(&self.name.deserialize);
|
self.name.deserialize = rules.deserialize.apply_to_field(&self.name.deserialize);
|
||||||
}
|
}
|
||||||
self.name.insert_deserialize_name_into_aliases();
|
self.name
|
||||||
|
.deserialize_aliases
|
||||||
|
.insert(self.name.deserialize.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn skip_serializing(&self) -> bool {
|
pub fn skip_serializing(&self) -> bool {
|
||||||
|
|||||||
Reference in New Issue
Block a user