serde_attributes/alias/
syn.rs1use syn::{Lit, Meta};
2
3use super::Alias;
4
5pub const ALIAS: &str = "alias";
7
8impl<'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> {}