4 #![crate_type = "proc-macro"]
5 #![feature(proc_macro_quote)]
7 extern crate proc_macro;
12 pub fn cond(input: TokenStream) -> TokenStream {
13 let mut conds = Vec::new();
14 let mut input = input.into_iter().peekable();
15 while let Some(tree) = input.next() {
16 let cond = match tree {
17 TokenTree::Group(tt) => tt.stream(),
18 _ => panic!("Invalid input"),
20 let mut cond_trees = cond.clone().into_iter();
21 let test = cond_trees.next().expect("Unexpected empty condition in `cond!`");
22 let rhs = cond_trees.collect::<TokenStream>();
24 panic!("Invalid macro usage in cond: {}", cond);
26 let is_else = match test {
27 TokenTree::Ident(ref word) => &*word.to_string() == "else",
30 conds.push(if is_else || input.peek().is_none() {
33 quote!(if $test { $rhs } else)
37 conds.into_iter().flat_map(|x| x.into_iter()).collect()