xwrapup_parser/ds_node/
ds_attr.rs1use 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}