derive_attribute_utils/
syn_1.rs1use 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
8pub 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}