derive_attribute_utils/
syn_1.rs

1use std::{str::FromStr, fmt::Display};
2
3use proc_macro2::Ident;
4use syn_v1::{NestedMeta, spanned::Spanned, Attribute, Meta, MetaList, MetaNameValue, Lit, parse_quote, ExprArray, Expr, PathSegment, PathArguments, Path, token::Eq};
5
6use crate::{shared::GetSpan, SynVersion};
7
8/// Deserialization functions & types for Syn version 1
9pub struct Syn1;
10
11impl SynVersion for Syn1 {
12    type Attribute = Attribute;
13    type ArgMeta = NestedMeta;
14
15    fn deserialize_attr_args(attr: &Self::Attribute) -> Option<Vec<Self::ArgMeta>> {
16        match attr.parse_meta() {
17            Ok(Meta::List(MetaList { nested, .. })) => Some(nested.into_iter().collect()),
18            _ => None
19        }
20    }
21
22    fn deserialize_list_args(meta: &Self::ArgMeta) -> Option<Vec<Self::ArgMeta>> {
23        match meta.clone() {
24            NestedMeta::Meta(Meta::List(MetaList { nested, .. })) => Some(nested.into_iter().collect()),
25            _ => None
26        }
27    }
28
29    fn deserialize_bool(meta: &Self::ArgMeta) -> Option<bool> {
30        match meta {
31            NestedMeta::Meta(Meta::NameValue(MetaNameValue { lit: Lit::Bool(literal), .. })) => Some(literal.value()),
32            NestedMeta::Meta(Meta::Path(path)) => Some(true),
33            _ => None
34        }
35    }
36
37    fn deserialize_attr_key(meta: &Self::Attribute) -> Option<String> {
38        meta.path.get_ident().map(|id| id.to_string())
39    }
40
41    fn deserialize_key(meta: &Self::ArgMeta) -> Option<String> {
42        match meta {
43            NestedMeta::Meta(Meta::NameValue(MetaNameValue { path, .. })) => path.get_ident().map(|id| id.to_string()),
44            _ => None
45        }
46    }
47
48    fn deserialize_integer<T>(meta: &Self::ArgMeta) -> Option<T> where T: std::str::FromStr, T::Err: std::fmt::Display {
49        match meta {
50            NestedMeta::Meta(Meta::NameValue(MetaNameValue { lit: Lit::Int(literal), .. })) => literal.base10_parse().map_or(None, Some),
51            _ => None
52        }
53    }
54
55    fn deserialize_float<T>(meta: &Self::ArgMeta) ->  Option<T> where T: FromStr, T::Err: Display {
56        match meta {
57            NestedMeta::Meta(Meta::NameValue(MetaNameValue { lit: Lit::Float(literal), .. })) => literal.base10_parse().map_or(None, Some),
58            _ => None
59        }
60    }
61
62    fn deserialize_string(meta: &Self::ArgMeta) -> Option<String> {
63        match meta { 
64            NestedMeta::Meta(Meta::NameValue(MetaNameValue { lit: Lit::Str(literal), .. })) => Some(literal.value()),
65            _ => None
66        }
67    }
68
69    fn deserialize_array(meta: &Self::ArgMeta) -> Option<Vec<Self::ArgMeta>> {
70        unimplemented!("Parsing arrays/vectors is not implemented for Syn 1");
71    }
72
73    type Error = syn_v1::Error;
74    fn convert_error(error: crate::Error) -> Self::Error {
75        syn_v1::Error::new(error.location, error.msg)
76    }
77}
78
79
80impl GetSpan for Attribute {
81    fn get_span(&self) -> proc_macro2::Span {
82        self.span()
83    }
84}
85impl GetSpan for NestedMeta {
86    fn get_span(&self) -> proc_macro2::Span {
87        self.span()
88    }
89}