diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..044852b --- /dev/null +++ b/src/main.rs @@ -0,0 +1,47 @@ +use std::io; +use zsh_history as zh; + +fn print_usage(prog: &str) { + eprintln!("Usage:"); + eprintln!(" {} merge <left> <right> # two–way merge", prog); + eprintln!(" {} merge <left> <right> <ancestor> # three–way merge", prog); +} + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let args: Vec<String> = std::env::args().collect(); + let prog = &args[0]; + + if args.len() < 4 || args.len() > 5 || args[1] != "merge" { + print_usage(prog); + return Ok(()); + } + + // Open files and create readers in one go. + let mut readers: Vec<_> = args[2..] + .iter() + .map(|name| { + std::fs::File::open(name) + .map_err(zh::Error::Io) + .map(zh::Reader::new) + }) + .collect::<Result<_, _>>()?; + + let mut out = io::stdout().lock(); + + let result = match readers.len() { + 2 => { + let ancestor = zh::Reader::new(io::empty()); + zh::merge(readers.remove(0), readers.remove(0), ancestor, &mut out) + } + 3 => zh::merge( + readers.remove(0), + readers.remove(0), + readers.remove(0), + &mut out, + ), + _ => unreachable!(), + }; + + result?; + Ok(()) +} |
