1 use crate::internals::attr::{Attr, VecAttr}; 2 use proc_macro2::{Ident, Span, TokenStream}; 3 use quote::ToTokens; 4 use std::cmp::Ordering; 5 use std::collections::BTreeSet; 6 use std::fmt::{self, Display}; 7 use syn::LitStr; 8 9 pub struct MultiName { 10 pub(crate) serialize: Name, 11 pub(crate) serialize_renamed: bool, 12 pub(crate) deserialize: Name, 13 pub(crate) deserialize_renamed: bool, 14 pub(crate) deserialize_aliases: BTreeSet<Name>, 15 } 16 17 impl MultiName { from_attrs( source_name: Name, ser_name: Attr<Name>, de_name: Attr<Name>, de_aliases: Option<VecAttr<Name>>, ) -> Self18 pub(crate) fn from_attrs( 19 source_name: Name, 20 ser_name: Attr<Name>, 21 de_name: Attr<Name>, 22 de_aliases: Option<VecAttr<Name>>, 23 ) -> Self { 24 let mut alias_set = BTreeSet::new(); 25 if let Some(de_aliases) = de_aliases { 26 for alias_name in de_aliases.get() { 27 alias_set.insert(alias_name); 28 } 29 } 30 31 let ser_name = ser_name.get(); 32 let ser_renamed = ser_name.is_some(); 33 let de_name = de_name.get(); 34 let de_renamed = de_name.is_some(); 35 MultiName { 36 serialize: ser_name.unwrap_or_else(|| source_name.clone()), 37 serialize_renamed: ser_renamed, 38 deserialize: de_name.unwrap_or(source_name), 39 deserialize_renamed: de_renamed, 40 deserialize_aliases: alias_set, 41 } 42 } 43 44 /// Return the container name for the container when serializing. serialize_name(&self) -> &Name45 pub fn serialize_name(&self) -> &Name { 46 &self.serialize 47 } 48 49 /// Return the container name for the container when deserializing. deserialize_name(&self) -> &Name50 pub fn deserialize_name(&self) -> &Name { 51 &self.deserialize 52 } 53 deserialize_aliases(&self) -> &BTreeSet<Name>54 pub(crate) fn deserialize_aliases(&self) -> &BTreeSet<Name> { 55 &self.deserialize_aliases 56 } 57 } 58 59 #[derive(Clone)] 60 pub struct Name { 61 pub value: String, 62 pub span: Span, 63 } 64 65 impl ToTokens for Name { to_tokens(&self, tokens: &mut TokenStream)66 fn to_tokens(&self, tokens: &mut TokenStream) { 67 LitStr::new(&self.value, self.span).to_tokens(tokens); 68 } 69 } 70 71 impl Ord for Name { cmp(&self, other: &Self) -> Ordering72 fn cmp(&self, other: &Self) -> Ordering { 73 Ord::cmp(&self.value, &other.value) 74 } 75 } 76 77 impl PartialOrd for Name { partial_cmp(&self, other: &Self) -> Option<Ordering>78 fn partial_cmp(&self, other: &Self) -> Option<Ordering> { 79 Some(Ord::cmp(self, other)) 80 } 81 } 82 83 impl Eq for Name {} 84 85 impl PartialEq for Name { eq(&self, other: &Self) -> bool86 fn eq(&self, other: &Self) -> bool { 87 self.value == other.value 88 } 89 } 90 91 impl From<&Ident> for Name { from(ident: &Ident) -> Self92 fn from(ident: &Ident) -> Self { 93 Name { 94 value: ident.to_string(), 95 span: ident.span(), 96 } 97 } 98 } 99 100 impl From<&LitStr> for Name { from(lit: &LitStr) -> Self101 fn from(lit: &LitStr) -> Self { 102 Name { 103 value: lit.value(), 104 span: lit.span(), 105 } 106 } 107 } 108 109 impl Display for Name { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result110 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 111 Display::fmt(&self.value, formatter) 112 } 113 } 114