elrond_wasm_derive/format/
format_tokenize.rs

1use 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}