use std::io::{self, Write, Read, stdout, BufWriter};
use config::{NewlineStyle, Config, WriteMode};
-use rustfmt_diff::{make_diff, print_diff};
+use rustfmt_diff::{make_diff, print_diff, Mismatch};
+use checkstyle::{output_header, output_footer, output_checkstyle_file};
// A map of the files of a crate, with their new content
pub type FileMap = HashMap<String, StringBuffer>;
}
}
-pub fn write_all_files(file_map: &FileMap,
- mode: WriteMode,
- config: &Config)
- -> Result<(), io::Error> {
+pub fn write_all_files<T>(file_map: &FileMap, out: &mut T, config: &Config) -> Result<(), io::Error>
+ where T: Write
+{
+ output_header(out, config.write_mode).ok();
for filename in file_map.keys() {
- try!(write_file(&file_map[filename], filename, mode, config));
+ try!(write_file(&file_map[filename], filename, out, config));
}
+ output_footer(out, config.write_mode).ok();
Ok(())
}
+
// Prints all newlines either as `\n` or as `\r\n`.
pub fn write_system_newlines<T>(writer: T,
text: &StringBuffer,
}
}
-pub fn write_file(text: &StringBuffer,
- filename: &str,
- mode: WriteMode,
- config: &Config)
- -> Result<Option<String>, io::Error> {
+pub fn write_file<T>(text: &StringBuffer,
+ filename: &str,
+ out: &mut T,
+ config: &Config)
+ -> Result<Option<String>, io::Error>
+ where T: Write
+{
fn source_and_formatted_text(text: &StringBuffer,
filename: &str,
Ok((ori_text, fmt_text))
}
- match mode {
+ fn create_diff(filename: &str,
+ text: &StringBuffer,
+ config: &Config)
+ -> Result<Vec<Mismatch>, io::Error> {
+ let (ori, fmt) = try!(source_and_formatted_text(text, filename, config));
+ Ok(make_diff(&ori, &fmt, 3))
+ }
+
+ match config.write_mode {
WriteMode::Replace => {
if let Ok((ori, fmt)) = source_and_formatted_text(text, filename, config) {
if fmt != ori {
|line_num| format!("\nDiff at line {}:", line_num));
}
}
- WriteMode::Default => {
- unreachable!("The WriteMode should NEVER Be default at this point!");
+ WriteMode::Checkstyle => {
+ let diff = try!(create_diff(filename, text, config));
+ try!(output_checkstyle_file(out, filename, diff));
}
}