use crate::deserialize::util::{make_build_fn_name, make_build_pair}; use crate::spec::leaf_enum_spec::LeafEnumBuildSpec; use proc_macro2::TokenStream; use quote::{format_ident, quote}; pub fn make_leaf_enum_build_fn(leaf_enum_build_spec: &LeafEnumBuildSpec) -> TokenStream { let build_fn_ident = format_ident!("{}", make_build_fn_name(leaf_enum_build_spec.build())); let pair_ident = format_ident!("{}", make_build_pair(leaf_enum_build_spec.build())); let return_type_ident = format_ident!("{}", leaf_enum_build_spec.build()); let rule_branches = leaf_enum_build_spec .rules() .map(|leaf_enum_rule| { let rule_ident = format_ident!("{}", leaf_enum_rule); quote! { Rule::#rule_ident => #return_type_ident::#rule_ident } }) .collect::>(); quote! { fn #build_fn_ident(file_id: usize, #pair_ident: Pair) -> #return_type_ident { let inner_pair = #pair_ident.into_inner().next().unwrap(); match inner_pair.as_rule() { #(#rule_branches,)* _ => unreachable!() } } } }