rustfmt_nightly/
emitter.rs

1pub(crate) use self::checkstyle::*;
2pub(crate) use self::diff::*;
3pub(crate) use self::files::*;
4pub(crate) use self::files_with_backup::*;
5pub(crate) use self::json::*;
6pub(crate) use self::modified_lines::*;
7pub(crate) use self::stdout::*;
8use crate::FileName;
9use std::io::{self, Write};
10use std::path::Path;
11
12mod checkstyle;
13mod diff;
14mod files;
15mod files_with_backup;
16mod json;
17mod modified_lines;
18mod stdout;
19
20pub(crate) struct FormattedFile<'a> {
21    pub(crate) filename: &'a FileName,
22    pub(crate) original_text: &'a str,
23    pub(crate) formatted_text: &'a str,
24}
25
26#[derive(Debug, Default, Clone)]
27pub(crate) struct EmitterResult {
28    pub(crate) has_diff: bool,
29}
30
31pub(crate) trait Emitter {
32    fn emit_formatted_file(
33        &mut self,
34        output: &mut dyn Write,
35        formatted_file: FormattedFile<'_>,
36    ) -> Result<EmitterResult, io::Error>;
37
38    fn emit_header(&self, _output: &mut dyn Write) -> Result<(), io::Error> {
39        Ok(())
40    }
41
42    fn emit_footer(&self, _output: &mut dyn Write) -> Result<(), io::Error> {
43        Ok(())
44    }
45}
46
47fn ensure_real_path(filename: &FileName) -> &Path {
48    match *filename {
49        FileName::Real(ref path) => path,
50        _ => panic!("cannot format `{filename}` and emit to files"),
51    }
52}