Skip to main content

xwrapup_parser/ds_node/
ds_attr.rs

1use quote::{quote, ToTokens};
2use std::fmt::Debug;
3use syn::parse::{Parse, ParseStream};
4
5pub struct DsAttr {
6    pub name: syn::Ident,
7    pub value: syn::Expr,
8}
9
10impl Debug for DsAttr {
11    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12        let DsAttr { name, value } = self;
13        write!(
14            f,
15            "DsAttr {{ name: {}, value: {:?} }}",
16            name,
17            value.to_token_stream().to_string()
18        )
19    }
20}
21
22#[derive(Debug)]
23pub struct DsAttrs {
24    pub attrs: Vec<DsAttr>,
25}
26
27impl Parse for DsAttr {
28    fn parse(input: ParseStream) -> syn::Result<Self> {
29        let name = input.parse::<syn::Ident>()?;
30        input.parse::<syn::Token![:]>()?;
31        let value = input.parse::<syn::Expr>()?;
32
33        Ok(DsAttr { name, value })
34    }
35}
36
37impl Parse for DsAttrs {
38    fn parse(input: ParseStream) -> syn::Result<Self> {
39        let mut attrs = Vec::new();
40
41        let params;
42        if input.peek(syn::token::Paren) {
43            syn::parenthesized!(params in input);
44            while !params.is_empty() {
45                attrs.push(params.parse()?);
46                if params.peek(syn::Token![,]) {
47                    params.parse::<syn::Token![,]>()?;
48                }
49            }
50        }
51
52        Ok(DsAttrs { attrs })
53    }
54}
55
56impl ToTokens for DsAttr {
57    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
58        let DsAttr { name, value } = self;
59        let name_string = name.to_string();
60        let token_string = quote! {
61            println!("setAttribute({}, {})", #name_string, stringify!(#value));
62        };
63
64        tokens.extend(quote! {
65            #token_string
66        });
67    }
68}