Skip to main content

serde_attributes/rename_all/
syn.rs

1use serde_rename_rule::{ParseError as RenameRuleParseError, RenameRule};
2use syn::{Error as SynError, Expr, Meta, MetaList};
3
4use crate::{
5    Symbol,
6    rename::{Rename, RenameIndependent, syn::FromMetaError as RenameFromMetaError},
7};
8
9use super::{RenameAll, RenameAllIndependent};
10
11/// [Ref](https://github.com/serde-rs/serde/blob/v1.0.127/serde_derive/src/internals/symbol.rs#L24)
12pub const RENAME_ALL: Symbol = Symbol("rename_all");
13
14/// [Ref](https://github.com/serde-rs/serde/blob/v1.0.127/serde_derive/src/internals/attr.rs#L335-L364)
15impl<'a> core::convert::TryFrom<&'a Meta> for RenameAll {
16    type Error = FromMetaError<'a>;
17
18    fn try_from(meta: &'a Meta) -> Result<Self, Self::Error> {
19        match Rename::try_from_meta(meta, RENAME_ALL) {
20            Ok(rename) => match rename {
21                Rename::Normal(name) => RenameRule::from_rename_all_str(name.as_str())
22                    .map(Self::Normal)
23                    .map_err(FromMetaError::RenameRuleParseError),
24                Rename::Independent(RenameIndependent::Serialize(ser_name)) => {
25                    RenameRule::from_rename_all_str(ser_name.as_str())
26                        .map(|x| Self::Independent(RenameAllIndependent::Serialize(x)))
27                        .map_err(FromMetaError::RenameRuleParseError)
28                }
29                Rename::Independent(RenameIndependent::Deserialize(de_name)) => {
30                    RenameRule::from_rename_all_str(de_name.as_str())
31                        .map(|x| Self::Independent(RenameAllIndependent::Deserialize(x)))
32                        .map_err(FromMetaError::RenameRuleParseError)
33                }
34                Rename::Independent(RenameIndependent::Both {
35                    serialize: ser_name,
36                    deserialize: de_name,
37                }) => Ok(Self::Independent(RenameAllIndependent::Both {
38                    serialize: RenameRule::from_rename_all_str(ser_name.as_str())
39                        .map_err(FromMetaError::RenameRuleParseError)?,
40                    deserialize: RenameRule::from_rename_all_str(de_name.as_str())
41                        .map_err(FromMetaError::RenameRuleParseError)?,
42                })),
43            },
44            Err(err) => match err {
45                RenameFromMetaError::MetaTypeOrPathMismatch(meta) => {
46                    Err(FromMetaError::MetaTypeOrPathMismatch(meta))
47                }
48                RenameFromMetaError::MetaNameValueExprTypeMismatch(expr) => {
49                    Err(FromMetaError::MetaNameValueExprTypeMismatch(expr))
50                }
51                RenameFromMetaError::MetaListTypeMismatch(meta_list, err) => {
52                    Err(FromMetaError::MetaListTypeMismatch(meta_list, err))
53                }
54                RenameFromMetaError::AtLeastOneOfSerAndDe => {
55                    Err(FromMetaError::AtLeastOneOfSerAndDe)
56                }
57            },
58        }
59    }
60}
61
62pub enum FromMetaError<'a> {
63    MetaTypeOrPathMismatch(&'a Meta),
64    MetaNameValueExprTypeMismatch(&'a Expr),
65    MetaListTypeMismatch(&'a MetaList, SynError),
66    AtLeastOneOfSerAndDe,
67    RenameRuleParseError(RenameRuleParseError),
68}
69impl<'a> core::fmt::Debug for FromMetaError<'a> {
70    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
71        match self {
72            Self::MetaTypeOrPathMismatch(_) => write!(f, "MetaTypeOrPathMismatch"),
73            Self::MetaNameValueExprTypeMismatch(_) => write!(f, "MetaNameValueExprTypeMismatch"),
74            Self::MetaListTypeMismatch(_, _) => write!(f, "MetaListTypeMismatch"),
75            Self::AtLeastOneOfSerAndDe => write!(f, "AtLeastOneOfSerAndDe"),
76            Self::RenameRuleParseError(_) => write!(f, "RenameRuleParseError"),
77        }
78    }
79}
80impl<'a> core::fmt::Display for FromMetaError<'a> {
81    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
82        write!(f, "{self:?}")
83    }
84}
85
86impl<'a> core::error::Error for FromMetaError<'a> {}