use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Clone, Debug, ValueEnum, Default)]
pub enum BackendType {
#[default]
Sqlite,
#[cfg(feature = "native-v3")]
V3,
}
#[derive(Parser)]
#[command(name = "sqlitegraph")]
#[command(about = "SQLiteGraph CLI - Graph database query tool")]
#[command(version)]
pub struct Cli {
#[arg(short, long, default_value = "graph.db")]
pub db: PathBuf,
#[arg(short, long, value_enum, default_value = "sqlite")]
pub backend: BackendType,
#[arg(long, global = true)]
pub write: bool,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
Query {
query: String,
},
Status {
#[arg(long)]
compact: bool,
},
List {
#[arg(short, long)]
kind: Option<String>,
},
Bfs {
#[arg(short, long)]
start: i64,
#[arg(short, long, default_value = "3")]
depth: u32,
},
Path {
#[arg(short, long)]
from: i64,
#[arg(short, long)]
to: i64,
},
Neighbors {
#[arg(short, long)]
id: i64,
#[arg(short, long, default_value = "outgoing")]
direction: Direction,
},
Algo {
#[command(subcommand)]
command: AlgoCommands,
},
Export {
#[arg(short, long)]
output: PathBuf,
},
Import {
#[arg(short, long)]
input: PathBuf,
},
Insert {
#[arg(short, long)]
kind: String,
#[arg(short, long)]
name: String,
#[arg(short, long)]
data: Option<String>,
},
Hnsw {
#[command(subcommand)]
command: HnswCommands,
},
}
#[derive(Subcommand)]
pub enum HnswCommands {
Create {
#[arg(short, long)]
name: String,
#[arg(short, long)]
dim: usize,
#[arg(short, long, default_value = "cosine")]
metric: String,
#[arg(long, default_value = "16")]
m: usize,
#[arg(long, default_value = "200")]
ef_construction: usize,
},
Insert {
#[arg(short, long)]
name: String,
#[arg(short, long)]
vector: String,
#[arg(long)]
metadata: Option<String>,
},
Search {
#[arg(short, long)]
name: String,
#[arg(short, long, default_value = "10")]
k: usize,
#[arg(short, long)]
vector: String,
},
List,
Delete {
#[arg(short, long)]
name: String,
},
}
#[derive(Subcommand)]
pub enum AlgoCommands {
Pagerank {
#[arg(short, long, default_value = "100")]
iterations: usize,
},
Betweenness,
Components,
Scc,
Topo,
Louvain {
#[arg(short = 'i', long, default_value = "100")]
max_iterations: usize,
},
LabelProp {
#[arg(short = 'i', long, default_value = "50")]
max_iterations: usize,
},
Cycles {
#[arg(short, long, default_value = "100")]
limit: usize,
},
Dominators {
#[arg(short, long)]
entry: i64,
},
CriticalPath,
}
#[derive(Clone, Debug, ValueEnum)]
pub enum Direction {
Incoming,
Outgoing,
Both,
}