use anyhow::Result;
use clap::Parser;
mod app;
mod collect;
mod config;
mod insights;
mod recording;
mod snapshot;
mod tabs;
mod ui;
use config::SyswatchConfig;
#[derive(Parser, Debug)]
#[command(
name = "syswatch",
version,
about = "Single-host system diagnostics TUI"
)]
struct Cli {
#[arg(long)]
tick: Option<u64>,
#[arg(long)]
tab: Option<String>,
#[arg(long, value_name = "PATH")]
replay: Option<std::path::PathBuf>,
}
fn main() -> Result<()> {
let cli = Cli::parse();
let mut cfg = SyswatchConfig::load();
if let Some(t) = cli.tick {
cfg.tick_ms = t;
cfg.validate();
}
ui::theme::set_by_name(&cfg.theme);
let start_tab = cli.tab.or_else(|| Some(cfg.default_tab.clone()));
let replay = if let Some(path) = cli.replay {
let snaps = recording::read(&path)
.map_err(|e| anyhow::anyhow!("could not read recording {}: {}", path.display(), e))?;
if snaps.is_empty() {
return Err(anyhow::anyhow!(
"recording {} contains no snapshots",
path.display()
));
}
eprintln!(
"syswatch: replaying {} snapshots from {}",
snaps.len(),
path.display()
);
Some(snaps)
} else {
None
};
app::run(app::Options {
start_tab,
config: cfg,
replay,
})
}