use std::path::PathBuf;
use std::process::ExitCode;
use clap::{Parser, Subcommand};
use zkv::app::App;
use zkv::ui;
#[derive(Parser, Debug)]
#[command(
name = "zkv",
version,
about = "Zero Knowledge Vault — local-first, end-to-end encrypted vault",
long_about = None,
)]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand, Debug)]
enum Command {
New {
path: PathBuf,
},
Open {
path: PathBuf,
},
}
fn main() -> ExitCode {
if let Err(e) = color_eyre::install() {
eprintln!("warning: color_eyre already installed: {e}");
}
let prev_hook = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
let _ = crossterm::terminal::disable_raw_mode();
let _ = crossterm::execute!(
std::io::stdout(),
crossterm::terminal::LeaveAlternateScreen
);
prev_hook(info);
}));
match run() {
Ok(()) => ExitCode::SUCCESS,
Err(report) => {
eprintln!("{report:?}");
ExitCode::FAILURE
}
}
}
fn run() -> color_eyre::Result<()> {
let cli = Cli::parse();
let app = match cli.command {
Command::New { path } => App::for_create(path),
Command::Open { path } => App::for_open(path),
};
ui::run(app)?;
Ok(())
}