wagon_codegen/nodes/
atom.rs

1use quote::quote;
2
3use wagon_parser::parser::atom::Atom;
4use crate::SpannableIdent;
5
6use super::{Rc, ToTokensState};
7use proc_macro2::{TokenStream, Ident};
8
9impl<U> ToTokensState<U> for Atom {
10    fn to_tokens(&self, state: &mut U, label: Rc<Ident>, attr_fun: fn(&mut U, Rc<Ident>, SpannableIdent)) -> TokenStream {
11        match self {
12            Self::Ident(i) => {
13                let proc_ident = i.to_ident();
14                attr_fun(state, label, i.clone().into());
15                quote!(#proc_ident.clone())
16            },
17            Self::LitBool(b) => quote!(wagon_value::Value::from(#b)),
18            Self::LitNum(n) => quote!(wagon_value::Value::from(#n)),
19            Self::LitFloat(f) => {
20                let real_float: f32 = **f;
21                quote!(wagon_value::Value::try_from(#real_float)?)
22            },
23            Self::LitString(s) => quote!(wagon_value::Value::from(#s)),
24            Self::Group(g) => {
25                let g_stream = g.to_tokens(state, label, attr_fun);
26                quote!((#g_stream))
27            },
28            Self::Dict(d) => {
29                let (i, e) = d.deconstruct();
30                let e_stream = e.to_tokens(state, label.clone(), attr_fun);
31                let ident = i.to_ident();
32                attr_fun(state, label, i.clone().into());
33                quote!(#ident[#e_stream])
34            },
35        }
36    }
37}