serde_attributes/rename_all/
syn.rs1use 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
11pub const RENAME_ALL: Symbol = Symbol("rename_all");
13
14impl<'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> {}