31 lines
1.1 KiB
Rust
31 lines
1.1 KiB
Rust
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::<Vec<_>>();
|
|
|
|
quote! {
|
|
fn #build_fn_ident(file_id: usize, #pair_ident: Pair<Rule>) -> #return_type_ident {
|
|
let inner_pair = #pair_ident.into_inner().next().unwrap();
|
|
match inner_pair.as_rule() {
|
|
#(#rule_branches,)*
|
|
_ => unreachable!()
|
|
}
|
|
}
|
|
}
|
|
}
|