#![deny(rustdoc::broken_intra_doc_links)]
use std::path::PathBuf;
use std::process::ExitCode;
use clap::{Parser, Subcommand};
use samkhya_core::Result;
mod cmd;
#[derive(Debug, Parser)]
#[command(
name = "samkhya",
about = "Operator CLI for samkhya: inspect sidecars, query feedback stores, build sketches",
version
)]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Debug, Subcommand)]
enum Command {
Inspect {
path: PathBuf,
},
Stats {
path: PathBuf,
},
#[command(subcommand)]
Sketch(SketchCmd),
#[command(subcommand)]
Puffin(PuffinCmd),
}
#[derive(Debug, Subcommand)]
enum SketchCmd {
Hll {
#[arg(long)]
input: PathBuf,
#[arg(long)]
column: usize,
#[arg(long)]
precision: u8,
#[arg(long, default_value_t = false)]
header: bool,
#[arg(long)]
output: Option<PathBuf>,
},
Bloom {
#[arg(long)]
input: PathBuf,
#[arg(long)]
column: usize,
#[arg(long)]
capacity: usize,
#[arg(long, value_name = "RATE")]
fp_rate: f64,
#[arg(long, default_value_t = false)]
header: bool,
#[arg(long)]
output: Option<PathBuf>,
},
Cms {
#[arg(long)]
input: PathBuf,
#[arg(long)]
column: usize,
#[arg(long)]
depth: u32,
#[arg(long)]
width: u32,
#[arg(long, default_value_t = false)]
header: bool,
#[arg(long)]
output: Option<PathBuf>,
},
Histogram {
#[arg(long)]
input: PathBuf,
#[arg(long)]
column: usize,
#[arg(long)]
buckets: usize,
#[arg(long, default_value_t = false)]
header: bool,
#[arg(long)]
output: Option<PathBuf>,
},
}
#[derive(Debug, Subcommand)]
enum PuffinCmd {
Pack {
out: PathBuf,
#[arg(long, value_name = "FILE")]
hll: Vec<PathBuf>,
#[arg(long, value_name = "FILE")]
bloom: Vec<PathBuf>,
#[arg(long, value_name = "FILE")]
cms: Vec<PathBuf>,
#[arg(long, value_name = "FILE")]
histogram: Vec<PathBuf>,
},
Verify {
path: PathBuf,
},
}
fn run() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Command::Inspect { path } => cmd::inspect::run(&path),
Command::Stats { path } => cmd::stats::run(&path),
Command::Sketch(sk) => match sk {
SketchCmd::Hll {
input,
column,
precision,
header,
output,
} => cmd::sketch::hll(&input, column, precision, header, output.as_deref()),
SketchCmd::Bloom {
input,
column,
capacity,
fp_rate,
header,
output,
} => cmd::sketch::bloom(&input, column, capacity, fp_rate, header, output.as_deref()),
SketchCmd::Cms {
input,
column,
depth,
width,
header,
output,
} => cmd::sketch::cms(&input, column, depth, width, header, output.as_deref()),
SketchCmd::Histogram {
input,
column,
buckets,
header,
output,
} => cmd::sketch::histogram(&input, column, buckets, header, output.as_deref()),
},
Command::Puffin(p) => match p {
PuffinCmd::Pack {
out,
hll,
bloom,
cms,
histogram,
} => cmd::puffin::pack(&out, &hll, &bloom, &cms, &histogram),
PuffinCmd::Verify { path } => cmd::puffin::verify(&path),
},
}
}
fn main() -> ExitCode {
match run() {
Ok(()) => ExitCode::SUCCESS,
Err(e) => {
eprintln!("error: {e}");
ExitCode::FAILURE
}
}
}