serde_attributes/alias/
syn.rs

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