use anyhow::Result;
use clap::Parser;
use different::{DiffSettings, line_diff};
use log::debug;
use pathdiff::diff_paths;
use std::path::Path;
use std::path::PathBuf;
use std::{env, fs};
#[derive(Parser)]
struct Cli {
left: PathBuf,
right: PathBuf,
#[clap(flatten)]
settings: DiffSettings,
}
fn display_name(path: &Path, cwd: &Path) -> String {
diff_paths(path, cwd)
.map(|p| format!("./{}", p.display()))
.unwrap_or(path.display().to_string())
}
fn process_file(path: &Path, cwd: &Path) -> Result<(String, String, usize)> {
let path = path.canonicalize()?;
let name = display_name(&path, cwd);
let contents = fs::read_to_string(path)?;
let num_lines = contents.lines().count();
Ok((name, contents, num_lines))
}
fn main() -> Result<()> {
env_logger::init();
let cwd = env::current_dir()?;
let args = Cli::parse();
let left = args.left;
let right = args.right;
let (left_name, left_contents, left_num_lines) = process_file(&left, &cwd)?;
let (right_name, right_contents, right_num_lines) = process_file(&right, &cwd)?;
let num_lines = std::cmp::max(left_num_lines, right_num_lines);
let settings = args
.settings
.names(left_name, right_name)
.max_line_number(num_lines);
debug!("{settings:?}");
let diff = line_diff(&left_contents, &right_contents, &settings);
println!("{diff}");
Ok(())
}