serde_attributes/alias/
syn.rs

1use syn::{Lit, Meta};
2
3use super::Alias;
4
5/// [Ref](https://github.com/serde-rs/serde/blob/v1.0.127/serde_derive/src/internals/symbol.rs#L7)
6pub const ALIAS: &str = "alias";
7
8/// [Ref](https://github.com/serde-rs/serde/blob/v1.0.127/serde_derive/src/internals/attr.rs#L901-L906)
9impl<'a> core::convert::TryFrom<&'a Meta> for Alias {
10    type Error = FromMetaError<'a>;
11
12    fn try_from(meta: &'a Meta) -> Result<Self, Self::Error> {
13        match meta {
14            Meta::NameValue(meta_name_value) if meta_name_value.path.is_ident(ALIAS) => {
15                match &meta_name_value.lit {
16                    Lit::Str(s) => Ok(Self(s.value())),
17                    lit => Err(FromMetaError::LitTypeMismatch(lit)),
18                }
19            }
20            meta => Err(FromMetaError::MetaTypeOrPathMismatch(meta)),
21        }
22    }
23}
24
25pub enum FromMetaError<'a> {
26    MetaTypeOrPathMismatch(&'a Meta),
27    LitTypeMismatch(&'a Lit),
28}
29impl<'a> core::fmt::Debug for FromMetaError<'a> {
30    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
31        match self {
32            Self::MetaTypeOrPathMismatch(_) => write!(f, "MetaTypeOrPathMismatch"),
33            Self::LitTypeMismatch(_) => write!(f, "LitTypeMismatch"),
34        }
35    }
36}
37impl<'a> core::fmt::Display for FromMetaError<'a> {
38    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
39        write!(f, "{self:?}")
40    }
41}
42#[cfg(feature = "std")]
43impl<'a> std::error::Error for FromMetaError<'a> {}