diff --git a/proc/src/proc_command.rs b/proc/src/proc_command.rs index 9d1d9ad..7102fd8 100644 --- a/proc/src/proc_command.rs +++ b/proc/src/proc_command.rs @@ -202,7 +202,7 @@ impl ToTokens for CommandVariant { out.append(Group::new(Delimiter::Parenthesis, { let mut out = TokenStream2::new(); for arg in args.iter() { - if let FnArg::Typed(PatType { attrs, pat, colon_token, ty }) = arg { + if let FnArg::Typed(PatType { ty, .. }) = arg { out.append(LitStr::new( &format!("{}", quote! { #ty }), Span::call_site() diff --git a/proc/src/proc_expose.rs b/proc/src/proc_expose.rs index 0303509..f3bb235 100644 --- a/proc/src/proc_expose.rs +++ b/proc/src/proc_expose.rs @@ -7,10 +7,7 @@ pub(crate) struct ExposeDef(pub(crate) ExposeMeta, pub(crate) ExposeImpl); pub(crate) struct ExposeMeta; #[derive(Debug, Clone)] -pub(crate) struct ExposeImpl { - block: ItemImpl, - exposed: BTreeMap>, -} +pub(crate) struct ExposeImpl(ItemImpl, BTreeMap>); #[derive(Debug, Clone)] struct ExposeArm(String, Ident); @@ -49,26 +46,22 @@ impl Parse for ExposeImpl { } } } - Ok(Self { block, exposed }) + Ok(Self(block, exposed)) } } impl ToTokens for ExposeDef { fn to_tokens (&self, out: &mut TokenStream2) { - let Self(meta, data) = self; - for token in quote! { #data } { - out.append(token) - } + let Self(_meta, data) = self; + write_quote_to(out, quote! { #data }); } } impl ToTokens for ExposeImpl { fn to_tokens (&self, out: &mut TokenStream2) { - let Self { block, exposed } = self; - let target = &self.block.self_ty; - for token in quote! { #block } { - out.append(token); - } + let Self(block, exposed) = self; + let target = &block.self_ty; + write_quote_to(out, quote! { #block }); for (t, variants) in exposed.iter() { let formatted_type = format!("{}", quote! { #t }); let predefined = match formatted_type.as_str() { @@ -89,8 +82,8 @@ impl ToTokens for ExposeImpl { }, _ => quote! {}, }; - let values = variants.iter().map(|(k, v)|ExposeArm(k.clone(), v.clone())); - let trait_impl = quote! { + let values = variants.iter().map(ExposeArm::from); + write_quote_to(out, quote! { impl ::tengri::dsl::Context<#t> for #target { fn get (&self, dsl: &::tengri::dsl::Value) -> Option<#t> { Some(match dsl { @@ -100,10 +93,7 @@ impl ToTokens for ExposeImpl { }) } } - }; - for token in trait_impl { - out.append(token); - } + }); } if exposed.len() > 0 { //panic!("{}", quote! {#out}); @@ -111,34 +101,19 @@ impl ToTokens for ExposeImpl { } } +impl From<(&String, &Ident)> for ExposeArm { + fn from ((a, b): (&String, &Ident)) -> Self { + Self(a.clone(), b.clone()) + } +} + impl ToTokens for ExposeArm { fn to_tokens (&self, out: &mut TokenStream2) { let Self(key, value) = self; - out.append(Punct::new(':', Joint)); - out.append(Punct::new(':', Alone)); - out.append(Ident::new("tengri", Span::call_site())); - out.append(Punct::new(':', Joint)); - out.append(Punct::new(':', Alone)); - out.append(Ident::new("dsl", Span::call_site())); - out.append(Punct::new(':', Joint)); - out.append(Punct::new(':', Alone)); - out.append(Ident::new("Value", Span::call_site())); - out.append(Punct::new(':', Joint)); - out.append(Punct::new(':', Alone)); - out.append(Ident::new("Sym", Span::call_site())); - out.append(Group::new(Delimiter::Parenthesis, { - let mut out = TokenStream2::new(); - out.append(LitStr::new(&key, Span::call_site()).token()); - out - })); - out.append(Punct::new('=', Joint)); - out.append(Punct::new('>', Alone)); - out.append(Ident::new("self", Span::call_site())); - out.append(Punct::new('.', Alone)); - for token in quote! { #value } { - out.append(token); - } - out.append(Group::new(Delimiter::Parenthesis, TokenStream2::new())); + let key = LitStr::new(&key, Span::call_site()); + write_quote_to(out, quote! { + ::tengri::dsl::Value::Sym(#key) => self.#value() + }) } }