aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs47
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(())
+}