1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
use proc_macro::{Group, Ident, TokenStream, TokenTree}; use rot13::rot13; fn rottt(t: TokenTree) -> TokenTree { match t { TokenTree::Group(g) => { let mut d = Group::new(g.delimiter(), rot_stream(g.stream())); d.set_span(g.span()); TokenTree::Group(d) } TokenTree::Ident(i) => { let gi = Ident::new(&rot13(&i.to_string()), i.span()); TokenTree::Ident(gi) } _ => t, } } fn rot_stream(ts: TokenStream) -> TokenStream { ts.into_iter().map(rottt).collect() } #[proc_macro] pub fn rot(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let output: TokenStream = rot_stream(input); output }