use std::path::PathBuf;
use clap::{Args, Parser, Subcommand, ValueEnum};
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueEnum)]
pub enum Format {
Csv,
Jsonl,
Table,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueEnum)]
pub enum BinaryFormat {
None,
Hex,
Base64,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueEnum)]
pub enum SchemaType {
Arrow,
Physical,
}
#[derive(Debug, Clone, Args, Default)]
pub struct LanceArgs {
#[arg(long)]
pub branch: Option<String>,
#[arg(long, conflicts_with = "tag")]
pub version: Option<u64>,
#[arg(long, conflicts_with = "version")]
pub tag: Option<String>,
}
impl LanceArgs {
pub fn is_any_set(&self) -> bool {
self.branch.is_some() || self.version.is_some() || self.tag.is_some()
}
}
#[derive(Debug, Parser)]
#[command(name = "arrs", about = "Inspect Arrow-based datasets.", version)]
pub struct Cli {
#[arg(long, global = true, value_enum)]
pub format: Option<Format>,
#[arg(long = "binary-format", global = true, value_enum, default_value_t = BinaryFormat::None)]
pub binary_format: BinaryFormat,
#[arg(long, global = true, value_delimiter = ',')]
pub columns: Option<Vec<String>>,
#[arg(long = "exclude-columns", global = true, value_delimiter = ',')]
pub exclude_columns: Option<Vec<String>>,
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Cat {
#[arg(required = true)]
inputs: Vec<PathBuf>,
#[command(flatten)]
lance: LanceArgs,
},
Head {
input: PathBuf,
#[arg(short = 'n', long, default_value_t = 10)]
limit: u64,
#[command(flatten)]
lance: LanceArgs,
},
Tail {
input: PathBuf,
#[arg(short = 'n', long, default_value_t = 10)]
limit: u64,
#[command(flatten)]
lance: LanceArgs,
},
Take {
input: PathBuf,
#[arg(long, allow_hyphen_values = true)]
indices: String,
#[command(flatten)]
lance: LanceArgs,
},
Rowcount {
input: PathBuf,
#[command(flatten)]
lance: LanceArgs,
},
Sample {
input: PathBuf,
#[arg(short = 'n', long)]
limit: u64,
#[arg(long)]
seed: Option<u64>,
#[command(flatten)]
lance: LanceArgs,
},
Schema {
input: PathBuf,
#[arg(long = "type", value_enum, default_value_t = SchemaType::Arrow)]
ty: SchemaType,
#[command(flatten)]
lance: LanceArgs,
},
Versions {
input: PathBuf,
#[arg(long)]
branch: Option<String>,
#[arg(long = "tagged-only", default_value_t = false)]
tagged_only: bool,
},
Branches { input: PathBuf },
Tags { input: PathBuf },
Indices {
input: PathBuf,
#[command(flatten)]
lance: LanceArgs,
},
}