serde_attributes/rename_all/
syn.rs1use serde_rename_rule::{ParseError as RenameRuleParseError, RenameRule};
2use syn::{Lit, Meta, MetaNameValue, NestedMeta};
3
4use crate::rename::{Rename, RenameIndependent, syn::FromMetaError as RenameFromMetaError};
5
6use super::{RenameAll, RenameAllIndependent};
7
8pub const RENAME_ALL: &str = "rename_all";
10
11impl<'a> core::convert::TryFrom<&'a Meta> for RenameAll {
13 type Error = FromMetaError<'a>;
14
15 fn try_from(meta: &'a Meta) -> Result<Self, Self::Error> {
16 match Rename::try_from_meta(meta, RENAME_ALL) {
17 Ok(rename) => match rename {
18 Rename::Normal(name) => RenameRule::from_rename_all_str(name.as_str())
19 .map(Self::Normal)
20 .map_err(FromMetaError::RenameRuleParseError),
21 Rename::Independent(RenameIndependent::Serialize(ser_name)) => {
22 RenameRule::from_rename_all_str(ser_name.as_str())
23 .map(|x| Self::Independent(RenameAllIndependent::Serialize(x)))
24 .map_err(FromMetaError::RenameRuleParseError)
25 }
26 Rename::Independent(RenameIndependent::Deserialize(de_name)) => {
27 RenameRule::from_rename_all_str(de_name.as_str())
28 .map(|x| Self::Independent(RenameAllIndependent::Deserialize(x)))
29 .map_err(FromMetaError::RenameRuleParseError)
30 }
31 Rename::Independent(RenameIndependent::Both {
32 serialize: ser_name,
33 deserialize: de_name,
34 }) => Ok(Self::Independent(RenameAllIndependent::Both {
35 serialize: RenameRule::from_rename_all_str(ser_name.as_str())
36 .map_err(FromMetaError::RenameRuleParseError)?,
37 deserialize: RenameRule::from_rename_all_str(de_name.as_str())
38 .map_err(FromMetaError::RenameRuleParseError)?,
39 })),
40 },
41 Err(err) => match err {
42 RenameFromMetaError::MetaTypeOrPathMismatch(meta) => {
43 Err(FromMetaError::MetaTypeOrPathMismatch(meta))
44 }
45 RenameFromMetaError::LitTypeMismatch(lit) => {
46 Err(FromMetaError::LitTypeMismatch(lit))
47 }
48 RenameFromMetaError::NestedMetaTypeMismatch(nested_meta) => {
49 Err(FromMetaError::NestedMetaTypeMismatch(nested_meta))
50 }
51 RenameFromMetaError::NestedMetaPathMismatch(nested_meta, meta_name_value) => Err(
52 FromMetaError::NestedMetaPathMismatch(nested_meta, meta_name_value),
53 ),
54 RenameFromMetaError::AtLeastOneOfSerAndDe => {
55 Err(FromMetaError::AtLeastOneOfSerAndDe)
56 }
57 },
58 }
59 }
60}
61
62pub enum FromMetaError<'a> {
63 MetaTypeOrPathMismatch(&'a Meta),
64 LitTypeMismatch(&'a Lit),
65 NestedMetaTypeMismatch(&'a NestedMeta),
66 NestedMetaPathMismatch(&'a NestedMeta, &'a MetaNameValue),
67 AtLeastOneOfSerAndDe,
68 RenameRuleParseError(RenameRuleParseError),
69}
70impl<'a> core::fmt::Debug for FromMetaError<'a> {
71 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
72 match self {
73 Self::MetaTypeOrPathMismatch(_) => write!(f, "MetaTypeOrPathMismatch"),
74 Self::LitTypeMismatch(_) => write!(f, "LitTypeMismatch"),
75 Self::NestedMetaTypeMismatch(_) => write!(f, "NestedMetaTypeMismatch"),
76 Self::NestedMetaPathMismatch(_, _) => write!(f, "NestedMetaPathMismatch"),
77 Self::AtLeastOneOfSerAndDe => write!(f, "AtLeastOneOfSerAndDe"),
78 Self::RenameRuleParseError(_) => write!(f, "RenameRuleParseError"),
79 }
80 }
81}
82impl<'a> core::fmt::Display for FromMetaError<'a> {
83 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
84 write!(f, "{self:?}")
85 }
86}
87#[cfg(feature = "std")]
88impl<'a> std::error::Error for FromMetaError<'a> {}