Finite state machines in rust; bendns fork to add types.
peel
| -rw-r--r-- | rust-fsm-dsl/src/variant.rs | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/rust-fsm-dsl/src/variant.rs b/rust-fsm-dsl/src/variant.rs index 3bbd080..b4373a8 100644 --- a/rust-fsm-dsl/src/variant.rs +++ b/rust-fsm-dsl/src/variant.rs @@ -1,7 +1,7 @@ use std::{collections::BTreeSet, fmt::Display}; use proc_macro2::TokenStream; -use quote::ToTokens; +use quote::{quote, ToTokens}; use syn::{parse::Parse, *}; /// Variant with no discriminator #[derive(Debug, Clone)] @@ -28,10 +28,13 @@ pub fn tokenize( .into_iter() .map(|x| { let i = &x.ident; - x.field.as_ref().map_or(Ok(quote::quote! { #i }), |_| { + x.field.as_ref().map_or(Ok(quote! { #i }), |_| { let y = find_type(x, inputs); y.ok_or(Error::new_spanned(&x.ident, "type never specified")) - .map(|y| quote::quote! {#i(#y)}) + .map(|y| match y { + Type::Tuple(TypeTuple { elems, .. }) => quote! { #i(#elems) }, + y => quote! {#i(#y)}, + }) }) }) .collect::<Result<_>>() @@ -103,8 +106,11 @@ impl Variant { { let b = g .as_ref() - .map_or_else(Default::default, |x| quote::quote! { if #x }); - quote::quote! { #ident(#p) #b } + .map_or_else(Default::default, |x| quote! { if #x }); + match p { + Pat::Tuple(PatTuple { elems, .. }) => quote! { #ident(#elems) #b }, + p => quote! { #ident(#p) #b }, + } } else { self.ident.to_token_stream() } @@ -115,8 +121,14 @@ impl Variant { field: Some((_, p, g)), } = self { - let b = g.as_ref().map(|x| quote::quote! { #x }); - (quote::quote! { #ident(#p) }, b) + let b = g.as_ref().map(|x| quote! { #x }); + ( + match p { + Pat::Tuple(PatTuple { elems, .. }) => quote! { #ident(#elems) }, + p => quote! { #ident(#p) }, + }, + b, + ) } else { (self.ident.to_token_stream(), None) } @@ -176,7 +188,14 @@ impl Final { field: Some((_, _, v)), } = x { - quote::quote! { #ident ( #v ) } + let v = v + .as_ref() + .map(|x| match x { + Expr::Tuple(x) => quote! { #ident #x }, + x => quote! { #ident(#x)}, + }) + .unwrap_or(ident.to_token_stream()); + v } else { x.ident.to_token_stream() } |