use std::path::Path;
use anyhow::{Context, Result};
use sdivi_core::{compute_delta, Snapshot, SNAPSHOT_VERSION};
use crate::output;
pub fn run(prev_path: &Path, curr_path: &Path, format: &str) -> Result<()> {
let prev: Snapshot = load_snapshot(prev_path)
.with_context(|| format!("failed to load previous snapshot: {}", prev_path.display()))?;
let curr: Snapshot = load_snapshot(curr_path)
.with_context(|| format!("failed to load current snapshot: {}", curr_path.display()))?;
if prev.snapshot_version != SNAPSHOT_VERSION {
eprintln!(
"sdivi: warning: previous snapshot version {:?} != {:?} — treating as baseline",
prev.snapshot_version, SNAPSHOT_VERSION,
);
}
if curr.snapshot_version != SNAPSHOT_VERSION {
eprintln!(
"sdivi: warning: current snapshot version {:?} != {:?} — treating as baseline",
curr.snapshot_version, SNAPSHOT_VERSION,
);
}
let delta = compute_delta(&prev, &curr);
match format {
"json" => output::json::print_divergence(&delta)?,
_ => output::text::print_divergence(&delta),
}
Ok(())
}
fn load_snapshot(path: &Path) -> Result<Snapshot> {
let content =
std::fs::read_to_string(path).with_context(|| format!("cannot read {}", path.display()))?;
serde_json::from_str(&content)
.with_context(|| format!("cannot parse snapshot JSON from {}", path.display()))
}