| use proc_macro2::TokenStream; |
| use quote::{quote, ToTokens}; |
| |
| pub fn fold_quote<F, I, T>(input: impl Iterator<Item = I>, f: F) -> TokenStream |
| where |
| F: Fn(I) -> T, |
| T: ToTokens, |
| { |
| input.fold(quote! {}, |acc, x| { |
| let y = f(x); |
| quote! { #acc #y } |
| }) |
| } |
| |
| pub fn is_unit(v: &syn::Variant) -> bool { |
| match v.fields { |
| syn::Fields::Unit => true, |
| _ => false, |
| } |
| } |
| |
| #[cfg(feature = "debug-with-rustfmt")] |
| /// Pretty-print the output of proc macro using rustfmt. |
| pub fn debug_with_rustfmt(input: &TokenStream) { |
| use std::io::Write; |
| use std::process::{Command, Stdio}; |
| |
| let mut child = Command::new("rustfmt") |
| .stdin(Stdio::piped()) |
| .stdout(Stdio::piped()) |
| .spawn() |
| .expect("Failed to spawn rustfmt in stdio mode"); |
| { |
| let stdin = child.stdin.as_mut().expect("Failed to get stdin"); |
| stdin |
| .write_all(format!("{}", input).as_bytes()) |
| .expect("Failed to write to stdin"); |
| } |
| let rustfmt_output = child.wait_with_output().expect("rustfmt has failed"); |
| |
| eprintln!( |
| "{}", |
| String::from_utf8(rustfmt_output.stdout).expect("rustfmt returned non-UTF8 string") |
| ); |
| } |