patchy/
backup.rs

1use std::fs::read_to_string;
2use std::io::Write as _;
3use std::{
4    ffi::OsString,
5    fs::{File, ReadDir},
6    path::PathBuf,
7};
8use tempfile::tempfile;
9
10use crate::git_commands::GIT_ROOT;
11use crate::CONFIG_ROOT;
12
13pub fn files(config_files: ReadDir) -> anyhow::Result<Vec<(OsString, File, String)>> {
14    let mut backups = Vec::new();
15
16    for entry in config_files {
17        let config_file = entry?;
18
19        let path = config_file.path();
20        let contents = read_to_string(&path)?;
21
22        let filename = config_file.file_name();
23        let mut destination_backed_up = tempfile()?;
24
25        write!(destination_backed_up, "{contents}")?;
26
27        backups.push((filename, destination_backed_up, contents));
28    }
29
30    Ok(backups)
31}
32pub fn restore(file_name: &OsString, contents: &str) -> anyhow::Result<()> {
33    let path = GIT_ROOT.join(PathBuf::from(CONFIG_ROOT).join(file_name));
34    let mut file = File::create(&path)?;
35
36    write!(file, "{contents}")?;
37
38    Ok(())
39}