use anyhow::Result;
use crate::cli::{GlobalArgs, WalHealArgs, WalStatsArgs};
use crate::output::NdjsonWriter;
pub fn cmd_wal_stats(
args: &WalStatsArgs,
global: &GlobalArgs,
writer: &mut NdjsonWriter<impl std::io::Write>,
) -> Result<()> {
let workspace = global.resolve_workspace()?;
if args.dry_run {
let _plan = crate::ndjson_types::DryRunPlan {
r#type: "plan",
operation: "wal-stats".into(),
path: workspace.display().to_string(),
would_modify: false,
details: Some("scan workspace for .atomwrite.journal.*.json sidecars".into()),
};
return Ok(());
}
let stats = crate::wal::compute_wal_stats(&workspace)?;
writer.write_event(&stats)?;
Ok(())
}
pub fn cmd_wal_heal(
args: &WalHealArgs,
global: &GlobalArgs,
writer: &mut NdjsonWriter<impl std::io::Write>,
) -> Result<()> {
let workspace = global.resolve_workspace()?;
if args.dry_run {
let stats = crate::wal::compute_wal_stats(&workspace)?;
let plan = crate::ndjson_types::DryRunPlan {
r#type: "plan",
operation: "wal-heal".into(),
path: workspace.display().to_string(),
would_modify: true,
details: Some(format!(
"would remove up to {} terminal journals older than {}s (preserving Started orphans)",
stats.total_journals, args.threshold_secs
)),
};
writer.write_event(&plan)?;
return Ok(());
}
let report =
crate::wal::auto_heal_on_startup(&workspace, args.threshold_secs, args.max_duration_ms)?;
writer.write_event(&report)?;
Ok(())
}