syn_args/macro_args/def/
expr.rs

1use super::*;
2
3#[derive(Clone)]
4pub struct Expr(pub syn::Expr);
5
6impl<'a, T> From<T> for Expr
7where
8    T: Into<&'a str>,
9{
10    fn from(s: T) -> Self {
11        Expr(syn::parse_str(s.into()).unwrap())
12    }
13}
14
15impl PartialEq for Expr {
16    fn eq(&self, other: &Self) -> bool {
17        self.to_string() == other.to_string()
18    }
19}
20
21impl Debug for Expr {
22    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23        f.debug_tuple("Expr").field(&self.to_string()).finish()
24    }
25}
26
27impl TryFrom<&Value> for Expr {
28    type Error = Error;
29
30    fn try_from(value: &Value) -> Result<Self, Self::Error> {
31        match value {
32            Value::Expr(i) => Ok(i.clone()),
33            _ => Err(Error::new(proc_macro2::Span::call_site(), "Expected TryFrom<&Value> for Expr")),
34        }
35    }
36}
37
38impl ToString for Expr {
39    fn to_string(&self) -> std::string::String {
40        self.0.to_token_stream().to_string()
41    }
42}
43
44impl Deref for Expr {
45    type Target = syn::Expr;
46
47    fn deref(&self) -> &Self::Target {
48        &self.0
49    }
50}
51
52impl DerefMut for Expr {
53    fn deref_mut(&mut self) -> &mut Self::Target {
54        &mut self.0
55    }
56}
57
58// impl<'a> TryInto<def::Expr> for Transform<'a> {
59//     type Error = Error;
60
61//     fn try_into(self) -> Result<def::Expr, Self::Error> {
62//         if let Value::Object(obj) = self.value {
63//             if let Some(Value::Expr(v)) = obj.get(self.key) {
64//                 return Ok(v.clone());
65//             }
66//         }
67
68//         Err(Error::new(proc_macro2::Span::call_site(), "Expected TryInto<def::Expr> for Transform"))
69//     }
70// }
71
72impl TryFrom<Transform<'_>> for def::Expr {
73    type Error = Error;
74
75    fn try_from(value: Transform<'_>) -> Result<Self, Self::Error> {
76        if let Value::Object(obj) = value.value {
77            if let Some(Value::Expr(v)) = obj.get(value.key) {
78                return Ok(v.clone());
79            }
80        } else if let Value::Array(v) = value.value {
81            let index = value.key.parse::<usize>().map_err(|_| Error::new(proc_macro2::Span::call_site(), "Expected usize"))?;
82            if let Some(Value::Expr(v)) = v.get(index) {
83                return Ok(v.clone());
84            }
85        }
86
87        Err(Error::new(proc_macro2::Span::call_site(), "Expected TryFrom<Transform> for def::Expr"))
88    }
89}
90
91impl Expr {
92    pub fn to_parts_path(&self) -> Result<syn::Path, syn::Error> {
93        match &self.0 {
94            syn::Expr::Path(path) => Ok(path.path.clone()),
95            syn::Expr::Call(call) => {
96                if let syn::Expr::Path(path) = &*call.func {
97                    Ok(path.path.clone())
98                } else {
99                    Err(Error::new(proc_macro2::Span::call_site(), "Expected Path"))
100                }
101            }
102            _ => Err(Error::new(proc_macro2::Span::call_site(), "Expected Path")),
103        }
104    }
105
106    pub fn to_path_name(&self) -> Result<std::string::String, syn::Error> {
107        let path = self.to_parts_path()?;
108        Ok(path.segments.iter().map(|s| s.ident.to_string()).collect::<Vec<std::string::String>>().join("::"))
109    }
110}