temp/
lib.rs

1extern crate proc_macro;
2use proc_macro::TokenStream;
3use proc_macro::TokenTree;
4use proc_macro::Ident;
5use proc_macro::Span;
6use std::iter::FromIterator;
7static mut TEMP_COUNTER: i64 = 0;
8
9#[proc_macro]
10pub fn temp(item: TokenStream) -> TokenStream {
11    let mut iterator = item.clone().into_iter().peekable();
12    if item.is_empty() {
13	unsafe { TEMP_COUNTER += 1; }
14    } else if let Some(TokenTree::Literal(_)) = iterator.peek() {
15	if let Ok(number) = item.to_string().parse::<i64>() {
16	    unsafe { TEMP_COUNTER = number; }
17	}
18    } else if let Some(TokenTree::Punct(i)) = iterator.next() {
19	if i.as_char() == '+' {
20	    if let Some(TokenTree::Literal(i)) = iterator.next() {
21		if let Ok(number) = i.to_string().parse::<i64>() {
22		    unsafe { TEMP_COUNTER += number; }
23		}
24	    }
25	} else if i.as_char() == '-' {
26	    if let Some(TokenTree::Literal(i)) = iterator.next() {
27		if let Ok(number) = i.to_string().parse::<i64>() {
28		    unsafe { TEMP_COUNTER -= number; }
29		}
30	    } else if let None = iterator.next() {
31		
32	    }
33	}
34    } else {
35	panic!("Invalid input to temporary variable generator.");
36    }
37    TokenStream::from_iter([
38	TokenTree::Ident(Ident::new(format!("temp{}", unsafe { TEMP_COUNTER }).as_str(), Span::call_site()))
39    ])
40}