serde_attributes/alias/
syn.rs1use syn::{Expr, ExprLit, Lit, Meta};
2
3use crate::Symbol;
4
5use super::Alias;
6
7pub const ALIAS: Symbol = Symbol("alias");
9
10impl<'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> {}