use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Clone, Copy, Debug, ValueEnum)]
pub enum LogLevel {
Error,
Warn,
Info,
Debug,
Trace,
Off,
}
impl LogLevel {
pub fn to_level_filter(self) -> log::LevelFilter {
match self {
LogLevel::Error => log::LevelFilter::Error,
LogLevel::Warn => log::LevelFilter::Warn,
LogLevel::Info => log::LevelFilter::Info,
LogLevel::Debug => log::LevelFilter::Debug,
LogLevel::Trace => log::LevelFilter::Trace,
LogLevel::Off => log::LevelFilter::Off,
}
}
}
#[derive(Parser)]
#[command(name = "graphlite")]
#[command(about = "GraphLite - A lightweight ISO GQL Graph Database")]
#[command(version)]
pub struct Cli {
#[arg(short = 'u', long = "user", global = true)]
pub user: Option<String>,
#[arg(short = 'p', long = "password", global = true)]
pub password: Option<String>,
#[arg(short = 'l', long = "log-level", global = true, value_enum)]
pub log_level: Option<LogLevel>,
#[arg(short = 'v', long = "verbose", global = true)]
pub verbose: bool,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
Version,
Query {
query: String,
#[arg(long, default_value = "./db")]
path: PathBuf,
#[arg(short, long, default_value = "table")]
format: OutputFormat,
#[arg(short, long)]
explain: bool,
#[arg(long)]
ast: bool,
},
Gql {
#[arg(long, default_value = "./db")]
path: PathBuf,
#[arg(short, long)]
sample: bool,
},
Install {
#[arg(long, default_value = "./db")]
path: PathBuf,
#[arg(long, default_value = "admin")]
admin_user: String,
#[arg(long)]
admin_password: Option<String>,
#[arg(short, long)]
force: bool,
#[arg(short, long)]
yes: bool,
},
Session {
#[command(subcommand)]
action: SessionAction,
#[arg(long, default_value = "./db")]
path: PathBuf,
},
}
#[derive(Subcommand)]
pub enum SessionAction {
Set {
target: String,
value: String,
#[arg(short, long)]
parameter: Option<String>,
},
Reset {
target: Option<String>,
#[arg(short, long)]
all: bool,
},
Show {
#[arg(default_value = "all")]
target: String,
},
Close,
}
#[derive(Clone, Copy, Debug)]
pub enum OutputFormat {
Table,
Json,
Csv,
}
impl std::str::FromStr for OutputFormat {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"table" => Ok(OutputFormat::Table),
"json" => Ok(OutputFormat::Json),
"csv" => Ok(OutputFormat::Csv),
_ => Err(format!("Unknown output format: {}", s)),
}
}
}