serde_derive/internals/
name.rs

1use 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    /// Return the container name for the container when serializing.
45    pub fn serialize_name(&self) -> &Name {
46        &self.serialize
47    }
48
49    /// Return the container name for the container when deserializing.
50    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}