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 | cec98a7 | 2019-05-08 15:23:19 -0700 | [diff] [blame] | 9 | write!( |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame^] | 10 | formatted, |
David Tolnay | cec98a7 | 2019-05-08 15:23:19 -0700 | [diff] [blame] | 11 | "// THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT\n\n" |
David Tolnay | b2188a6 | 2019-05-09 11:42:44 -0700 | [diff] [blame] | 12 | )?; |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame^] | 13 | |
David Tolnay | cec98a7 | 2019-05-08 15:23:19 -0700 | [diff] [blame] | 14 | let mut config = rustfmt::Config::default(); |
| 15 | config.set().emit_mode(rustfmt::EmitMode::Stdout); |
| 16 | config.set().verbose(rustfmt::Verbosity::Quiet); |
| 17 | config.set().format_macro_matchers(true); |
| 18 | config.set().normalize_doc_attributes(true); |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame^] | 19 | |
| 20 | let mut session = rustfmt::Session::new(config, Some(&mut formatted)); |
David Tolnay | b2188a6 | 2019-05-09 11:42:44 -0700 | [diff] [blame] | 21 | session.format(rustfmt::Input::Text(content.to_string()))?; |
David Tolnay | 5ce7420 | 2019-05-09 11:55:17 -0700 | [diff] [blame^] | 22 | drop(session); |
| 23 | |
| 24 | if path.as_ref().is_file() && fs::read(&path)? == formatted { |
| 25 | return Ok(()); |
| 26 | } |
| 27 | |
| 28 | fs::write(path, formatted)?; |
David Tolnay | b2188a6 | 2019-05-09 11:42:44 -0700 | [diff] [blame] | 29 | Ok(()) |
David Tolnay | cec98a7 | 2019-05-08 15:23:19 -0700 | [diff] [blame] | 30 | } |