2 use crate::config::Config;
3 use crate::rustfmt_diff::{make_diff, print_diff};
5 pub(crate) struct DiffEmitter {
10 pub(crate) fn new(config: Config) -> Self {
15 impl Emitter for DiffEmitter {
16 fn emit_formatted_file(
18 output: &mut dyn Write,
24 ) -> Result<EmitterResult, io::Error> {
25 const CONTEXT_SIZE: usize = 3;
26 let mismatch = make_diff(&original_text, formatted_text, CONTEXT_SIZE);
27 let has_diff = !mismatch.is_empty();
30 if self.config.print_misformatted_file_names() {
31 writeln!(output, "{}", ensure_real_path(filename).display())?;
35 |line_num| format!("Diff in {} at line {}:", filename, line_num),
39 } else if original_text != formatted_text {
40 // This occurs when the only difference between the original and formatted values
41 // is the newline style. This happens because The make_diff function compares the
42 // original and formatted values line by line, independent of line endings.
43 let file_path = ensure_real_path(filename);
44 writeln!(output, "Incorrect newline style in {}", file_path.display())?;
45 return Ok(EmitterResult { has_diff: true });
48 return Ok(EmitterResult { has_diff });
55 use crate::config::Config;
57 use std::path::PathBuf;
60 fn does_not_print_when_no_files_reformatted() {
61 let mut writer = Vec::new();
62 let config = Config::default();
63 let mut emitter = DiffEmitter::new(config);
68 filename: &FileName::Real(PathBuf::from("src/lib.rs")),
69 original_text: "fn empty() {}\n",
70 formatted_text: "fn empty() {}\n",
74 assert_eq!(result.has_diff, false);
75 assert_eq!(writer.len(), 0);
79 fn prints_file_names_when_config_is_enabled() {
80 let bin_file = "src/bin.rs";
81 let bin_original = "fn main() {\nprintln!(\"Hello, world!\");\n}";
82 let bin_formatted = "fn main() {\n println!(\"Hello, world!\");\n}";
83 let lib_file = "src/lib.rs";
84 let lib_original = "fn greet() {\nprintln!(\"Greetings!\");\n}";
85 let lib_formatted = "fn greet() {\n println!(\"Greetings!\");\n}";
87 let mut writer = Vec::new();
88 let mut config = Config::default();
89 config.set().print_misformatted_file_names(true);
90 let mut emitter = DiffEmitter::new(config);
95 filename: &FileName::Real(PathBuf::from(bin_file)),
96 original_text: bin_original,
97 formatted_text: bin_formatted,
102 .emit_formatted_file(
105 filename: &FileName::Real(PathBuf::from(lib_file)),
106 original_text: lib_original,
107 formatted_text: lib_formatted,
113 String::from_utf8(writer).unwrap(),
114 format!("{}\n{}\n", bin_file, lib_file),
119 fn prints_newline_message_with_only_newline_style_diff() {
120 let mut writer = Vec::new();
121 let config = Config::default();
122 let mut emitter = DiffEmitter::new(config);
124 .emit_formatted_file(
127 filename: &FileName::Real(PathBuf::from("src/lib.rs")),
128 original_text: "fn empty() {}\n",
129 formatted_text: "fn empty() {}\r\n",
134 String::from_utf8(writer).unwrap(),
135 String::from("Incorrect newline style in src/lib.rs\n")