rustfmt_nightly/emitter/
files_with_backup.rs

1use super::*;
2use std::fs;
3
4#[derive(Debug, Default)]
5pub(crate) struct FilesWithBackupEmitter;
6
7impl Emitter for FilesWithBackupEmitter {
8    fn emit_formatted_file(
9        &mut self,
10        _output: &mut dyn Write,
11        FormattedFile {
12            filename,
13            original_text,
14            formatted_text,
15        }: FormattedFile<'_>,
16    ) -> Result<EmitterResult, io::Error> {
17        let filename = ensure_real_path(filename);
18        if original_text != formatted_text {
19            // Do a little dance to make writing safer - write to a temp file
20            // rename the original to a .bk, then rename the temp file to the
21            // original.
22            let tmp_name = filename.with_extension("tmp");
23            let bk_name = filename.with_extension("bk");
24
25            fs::write(&tmp_name, formatted_text)?;
26            fs::rename(filename, bk_name)?;
27            fs::rename(tmp_name, filename)?;
28        }
29        Ok(EmitterResult::default())
30    }
31}