chezmoi_modify_manager 0.0.1

Chezmoi addon to patch ini files with mixed settings and state (experimental rust branch)
use std::{
    fs::File,
    io::{stdin, stdout, Read, Write},
};

use ini_merge::merge_ini;

mod add;
mod arguments;
mod config;

fn main() -> anyhow::Result<()> {
    let opts = arguments::parse_args();
    match opts {
        arguments::Args::Process(file_name) => {
            let mut f = File::open(&file_name)?;
            let mut buf = String::new();
            f.read_to_string(&mut buf)?;
            let c = config::parse(&buf)?;

            let mut src_file = File::open(c.source_path(&file_name))?;
            let mut tgt_file = stdin().lock();
            let merged = merge_ini(&mut tgt_file, &mut src_file, &c.mutations)?;
            let mut stdout = stdout().lock();
            for line in merged {
                writeln!(stdout, "{line}")?;
            }
        }
        arguments::Args::Add { _a, files, style } => {
            for file in files {
                println!("Adding {file:?}");
                add::add(add::Mode::Normal, style, &file)?;
            }
        }
        arguments::Args::Smart { _a, files, style } => {
            for file in files {
                println!("Adding {file:?}");
                add::add(add::Mode::Smart, style, &file)?;
            }
        }
        #[cfg(feature = "updater")]
        arguments::Args::Update { _a } => {
            println!("TODO: Self update");
            todo!()
        }
    }
    Ok(())
}