use clap::{Args, Subcommand, ValueEnum};
use std::path::PathBuf;
#[cfg(feature = "parquet")]
use crate::export_parquet::ParquetCompression;
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum CliOutputFormat {
Table,
Json,
}
#[derive(Subcommand, Debug, Clone)]
pub enum AnalyticsCommand {
Inspect(InspectArgs),
Query(QueryArgs),
Stats(StatsArgs),
Export(ExportArgs),
}
#[derive(Args, Debug, Clone)]
pub struct InspectArgs {
pub input: PathBuf,
}
#[derive(Args, Debug, Clone)]
pub struct QueryArgs {
pub input: PathBuf,
pub sql: String,
#[arg(long, default_value = "table", value_enum)]
pub format: CliOutputFormat,
}
#[derive(Args, Debug, Clone)]
pub struct StatsArgs {
pub input: PathBuf,
#[arg(long, default_value = "table", value_enum)]
pub format: CliOutputFormat,
}
#[derive(Args, Debug, Clone)]
pub struct ExportArgs {
pub input: PathBuf,
#[arg(short, long, default_value = "export_parquet")]
pub out: PathBuf,
#[cfg(feature = "parquet")]
#[arg(long, default_value = "zstd")]
pub compression: ParquetCompression,
#[arg(long, default_value = "122880")]
pub row_group_size: usize,
#[arg(long)]
pub partition_by: Option<String>,
}
#[cfg(feature = "cli")]
pub mod export;
#[cfg(feature = "cli")]
pub mod inspect;
#[cfg(feature = "cli")]
pub mod query;
#[cfg(feature = "cli")]
pub mod stats;
use crate::Analytics;
use crate::error::Result;
pub async fn run_analytics(command: AnalyticsCommand) -> Result<()> {
match command {
AnalyticsCommand::Inspect(args) => {
let mut analytics = open_analytics(&args.input)?;
inspect::run(&mut analytics).await
}
AnalyticsCommand::Query(args) => {
let analytics = open_analytics(&args.input)?;
query::run(&analytics, &args.sql, &args.format).await
}
AnalyticsCommand::Stats(args) => {
let analytics = open_analytics(&args.input)?;
stats::run(&analytics, &args.format).await
}
AnalyticsCommand::Export(args) => {
let analytics = open_analytics(&args.input)?;
export::run(&analytics, args).await
}
}
}
fn open_analytics(path: &std::path::Path) -> Result<Analytics> {
if path.extension().and_then(|s| s.to_str()) == Some("json") {
let mut analytics = Analytics::open_in_memory()?;
analytics.load_export_json(path)?;
Ok(analytics)
} else {
Analytics::open(path)
}
}