serde_derive/internals/
name.rs1use crate::internals::attr::{Attr, VecAttr};
2use proc_macro2::{Ident, Span, TokenStream};
3use quote::ToTokens;
4use std::cmp::Ordering;
5use std::collections::BTreeSet;
6use std::fmt::{self, Display};
7use syn::LitStr;
8
9pub 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
17impl MultiName {
18 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 pub fn serialize_name(&self) -> &Name {
46 &self.serialize
47 }
48
49 pub fn deserialize_name(&self) -> &Name {
51 &self.deserialize
52 }
53
54 pub(crate) fn deserialize_aliases(&self) -> &BTreeSet<Name> {
55 &self.deserialize_aliases
56 }
57}
58
59#[derive(Clone)]
60pub struct Name {
61 pub value: String,
62 pub span: Span,
63}
64
65impl ToTokens for Name {
66 fn to_tokens(&self, tokens: &mut TokenStream) {
67 LitStr::new(&self.value, self.span).to_tokens(tokens);
68 }
69}
70
71impl Ord for Name {
72 fn cmp(&self, other: &Self) -> Ordering {
73 Ord::cmp(&self.value, &other.value)
74 }
75}
76
77impl PartialOrd for Name {
78 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
79 Some(Ord::cmp(self, other))
80 }
81}
82
83impl Eq for Name {}
84
85impl PartialEq for Name {
86 fn eq(&self, other: &Self) -> bool {
87 self.value == other.value
88 }
89}
90
91impl From<&Ident> for Name {
92 fn from(ident: &Ident) -> Self {
93 Name {
94 value: ident.to_string(),
95 span: ident.span(),
96 }
97 }
98}
99
100impl From<&LitStr> for Name {
101 fn from(lit: &LitStr) -> Self {
102 Name {
103 value: lit.value(),
104 span: lit.span(),
105 }
106 }
107}
108
109impl Display for Name {
110 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
111 Display::fmt(&self.value, formatter)
112 }
113}