David Tolnay | b2188a6 | 2019-05-09 11:42:44 -0700 | [diff] [blame] | 1 | use crate::error::Result; |
David Tolnay | cec98a7 | 2019-05-08 15:23:19 -0700 | [diff] [blame] | 2 | use proc_macro2::TokenStream; |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame] | 3 | use std::fs; |
| 4 | use std::io::Write; |
David Tolnay | d0b37d2 | 2019-05-08 15:26:03 -0700 | [diff] [blame] | 5 | use std::path::Path; |
David Tolnay | cec98a7 | 2019-05-08 15:23:19 -0700 | [diff] [blame] | 6 | |
David Tolnay | b2188a6 | 2019-05-09 11:42:44 -0700 | [diff] [blame] | 7 | pub fn write<P: AsRef<Path>>(path: P, content: TokenStream) -> Result<()> { |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame] | 8 | let mut formatted = Vec::new(); |
David Tolnay | cab909c | 2019-05-09 13:22:39 -0700 | [diff] [blame^] | 9 | writeln!(formatted, "// This file is @generated by syn-internal-codegen.")?; |
| 10 | writeln!(formatted, "// It is not intended for manual editing.")?; |
| 11 | writeln!(formatted)?; |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame] | 12 | |
David Tolnay | cec98a7 | 2019-05-08 15:23:19 -0700 | [diff] [blame] | 13 | let mut config = rustfmt::Config::default(); |
| 14 | config.set().emit_mode(rustfmt::EmitMode::Stdout); |
| 15 | config.set().verbose(rustfmt::Verbosity::Quiet); |
| 16 | config.set().format_macro_matchers(true); |
| 17 | config.set().normalize_doc_attributes(true); |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame] | 18 | |
| 19 | let mut session = rustfmt::Session::new(config, Some(&mut formatted)); |
David Tolnay | b2188a6 | 2019-05-09 11:42:44 -0700 | [diff] [blame] | 20 | session.format(rustfmt::Input::Text(content.to_string()))?; |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame] | 21 | drop(session); |
| 22 | |
| 23 | if path.as_ref().is_file() && fs::read(&path)? == formatted { |
| 24 | return Ok(()); |
| 25 | } |
| 26 | |
| 27 | fs::write(path, formatted)?; |
David Tolnay | b2188a6 | 2019-05-09 11:42:44 -0700 | [diff] [blame] | 28 | Ok(()) |
David Tolnay | cec98a7 | 2019-05-08 15:23:19 -0700 | [diff] [blame] | 29 | } |