use anyhow::Result; use proc_macro2::TokenStream; use std::fs; use std::io::Write; use std::path::Path; pub fn write>(path: P, content: TokenStream) -> Result<()> { let mut formatted = Vec::new(); writeln!( formatted, "// This file is @generated by syn-internal-codegen." )?; writeln!(formatted, "// It is not intended for manual editing.")?; writeln!(formatted)?; let mut config = rustfmt::Config::default(); config.set().emit_mode(rustfmt::EmitMode::Stdout); config.set().verbose(rustfmt::Verbosity::Quiet); config.set().format_macro_matchers(true); config.set().normalize_doc_attributes(true); let mut session = rustfmt::Session::new(config, Some(&mut formatted)); session.format(rustfmt::Input::Text(content.to_string()))?; drop(session); if path.as_ref().is_file() && fs::read(&path)? == formatted { return Ok(()); } fs::write(path, formatted)?; Ok(()) }