use bdiff::diff_file;
use bdiff::print::print_batch;
use bdiff::input::{Settings, ALIGN_RIGHT, DEFAULT_SETTINGS};
use std::fs;
use argparse::{ArgumentParser, Store, StoreTrue, StoreFalse, Print};
fn main() {
let (settings, left_name, right_name) = parse_args();
let left = fs::read(&left_name).expect(&format!("{}: No such file", left_name));
let right = fs::read(&right_name).expect(&format!("{}: No such file", right_name));
let fdiff = diff_file(&left, &right, &settings);
if !fdiff.is_empty() {
print!("bdiff {} {}\n--- {}\n+++ {}", left_name, right_name, left_name, right_name);
for batch in fdiff {
print!("{}", print_batch(batch, &settings));
}
println!();
}
}
fn parse_args() -> (Settings, String, String) {
let mut left = String::new();
let mut right = String::new();
let mut align = false;
let mut settings = DEFAULT_SETTINGS.clone();
{
let mut parser = ArgumentParser::new();
parser.set_description("Binary diff");
parser.refer(&mut settings.width).add_option(&["-w", "--width"], Store, "Bytes per line");
parser.refer(&mut settings.before).add_option(&["-B", "--before"], Store, "Full lines to show before a difference");
parser.refer(&mut settings.after).add_option(&["-A", "--after"], Store, "Full lines to show after a difference");
parser.refer(&mut align)
.add_option(&["-l", "--align-left"], StoreFalse, "Align with left file")
.add_option(&["-r", "--align-right"], StoreTrue, "Align with right file");
parser.refer(&mut left).add_argument("MINUS_FILE", Store, "First file to be compared").required();
parser.refer(&mut right).add_argument("PLUS_FILE", Store, "Second file to be compared").required();
parser.add_option(&["-v", "--version"], Print(env!("CARGO_PKG_VERSION").to_string()), "Show version");
parser.parse_args_or_exit();
}
assert!(settings.width > 0, "Width must be greater than zero.");
if align {
settings.align = ALIGN_RIGHT;
}
(settings, left, right)
}