elrond_wasm_derive/format/
format_tokenize.rs1use proc_macro::Group;
2
3fn token_tree_is_comma(tt: &proc_macro::TokenTree) -> bool {
4 if let proc_macro::TokenTree::Punct(punct) = &tt {
5 punct.as_char() == ','
6 } else {
7 false
8 }
9}
10
11fn flush_token_buffer(
12 output: &mut Vec<proc_macro::TokenTree>,
13 mut buffer: Vec<proc_macro::TokenTree>,
14) {
15 match buffer.len() {
16 0 => panic!("empty tokens not allowed in push_format macro"),
17 1 => output.append(&mut buffer),
18 _ => output.push(proc_macro::TokenTree::Group(Group::new(
19 proc_macro::Delimiter::Parenthesis,
20 buffer.into_iter().collect(),
21 ))),
22 }
23}
24
25pub fn tokenize(input: proc_macro::TokenStream) -> Vec<proc_macro::TokenTree> {
26 let mut buffer = Vec::new();
27 let mut output = Vec::new();
28 for tt in input.into_iter() {
29 if token_tree_is_comma(&tt) {
30 flush_token_buffer(&mut output, core::mem::take(&mut buffer));
31 } else {
32 buffer.push(tt);
33 }
34 }
35 flush_token_buffer(&mut output, buffer);
36 output
37}