use clap::{Args, Parser, Subcommand};
use crate::context::ColorChoice;
#[derive(Debug, Parser)]
#[command(
name = "dbmd",
version,
about = "The reference CLI for db.md — the open database in plain files.",
long_about = None,
propagate_version = true,
// Show the most useful help when invoked bare, rather than a terse error.
arg_required_else_help = true,
// We manage color ourselves via --color so output is pipe-safe by default.
disable_colored_help = true,
)]
pub struct Cli {
#[arg(long, global = true)]
pub json: bool,
#[arg(long, global = true, value_enum, default_value_t = ColorChoice::Auto, value_name = "WHEN")]
pub color: ColorChoice,
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Validate(ValidateArgs),
Format(FormatArgs),
Query(QueryArgs),
Links(LinksArgs),
Sections(SectionsArgs),
Extract(ExtractArgs),
Search(SearchArgs),
Graph(GraphArgs),
Fm(FmArgs),
Tree(TreeArgs),
Stats(StatsArgs),
Outline(OutlineArgs),
Index(IndexArgs),
Log(LogArgs),
Write(WriteArgs),
Link(LinkArgs),
Rename(RenameArgs),
Spec(SpecArgs),
}
#[derive(Debug, Args)]
pub struct ValidateArgs {
#[arg(value_name = "DIR", default_value = ".")]
pub dir: String,
#[arg(long)]
pub all: bool,
#[arg(long, value_name = "RFC3339")]
pub since: Option<String>,
}
#[derive(Debug, Args)]
pub struct FormatArgs {
#[arg(value_name = "FILE")]
pub file: String,
}
#[derive(Debug, Args)]
pub struct QueryArgs {
#[arg(long, value_name = "TYPE")]
pub r#type: Option<String>,
#[arg(long, value_name = "LAYER")]
pub r#in: Option<String>,
#[arg(long = "where", value_name = "K=V")]
pub r#where: Vec<String>,
#[arg(long, value_name = "N")]
pub limit: Option<usize>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct LinksArgs {
#[arg(value_name = "TARGET")]
pub target: String,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct SectionsArgs {
#[arg(value_name = "FILE")]
pub file: String,
}
#[derive(Debug, Args)]
pub struct ExtractArgs {
#[arg(value_name = "FILE")]
pub file: String,
#[arg(long, value_name = "PATH")]
pub out: Option<String>,
}
#[derive(Debug, Args)]
pub struct SearchArgs {
#[arg(value_name = "QUERY")]
pub query: String,
#[arg(long, value_name = "TYPE")]
pub r#type: Option<String>,
#[arg(long, value_name = "LAYER")]
pub r#in: Option<String>,
#[arg(long = "where", value_name = "K=V")]
pub r#where: Vec<String>,
#[arg(long, value_name = "PATH")]
pub linked_from: Option<String>,
#[arg(long, value_name = "PATH")]
pub linked_to: Option<String>,
#[arg(long, value_name = "RFC3339")]
pub updated_after: Option<String>,
#[arg(long, value_name = "RFC3339")]
pub updated_before: Option<String>,
#[arg(long, value_name = "RFC3339")]
pub created_after: Option<String>,
#[arg(long, value_name = "RFC3339")]
pub created_before: Option<String>,
#[arg(long, value_name = "N")]
pub limit: Option<usize>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct GraphArgs {
#[command(subcommand)]
pub command: GraphCommand,
}
#[derive(Debug, Subcommand)]
pub enum GraphCommand {
Backlinks(GraphTargetArgs),
Forwardlinks(GraphTargetArgs),
Neighborhood(NeighborhoodArgs),
Orphans(OrphansArgs),
}
#[derive(Debug, Args)]
pub struct GraphTargetArgs {
#[arg(value_name = "PATH")]
pub path: String,
#[arg(long, value_name = "TYPE")]
pub r#type: Option<String>,
#[arg(long, value_name = "LAYER")]
pub r#in: Option<String>,
#[arg(long, value_name = "N")]
pub limit: Option<usize>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct NeighborhoodArgs {
#[arg(value_name = "SEED")]
pub seed: String,
#[arg(long, value_name = "N", default_value_t = 1)]
pub hops: usize,
#[arg(long, value_name = "TYPE")]
pub r#type: Option<String>,
#[arg(long, value_name = "LAYER")]
pub r#in: Option<String>,
#[arg(long, value_name = "N")]
pub limit: Option<usize>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct OrphansArgs {
#[arg(long, value_name = "LAYER")]
pub r#in: Option<String>,
#[arg(long, value_name = "N")]
pub limit: Option<usize>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct FmArgs {
#[command(subcommand)]
pub command: FmCommand,
}
#[derive(Debug, Subcommand)]
pub enum FmCommand {
Get(FmGetArgs),
Set(FmSetArgs),
Query(FmQueryArgs),
Init(FmInitArgs),
}
#[derive(Debug, Args)]
pub struct FmGetArgs {
#[arg(value_name = "FILE")]
pub file: String,
#[arg(value_name = "KEY")]
pub key: String,
}
#[derive(Debug, Args)]
pub struct FmSetArgs {
#[arg(value_name = "FILE")]
pub file: String,
#[arg(value_name = "K=V")]
pub assignment: String,
}
#[derive(Debug, Args)]
pub struct FmQueryArgs {
#[arg(value_name = "K=V")]
pub assignment: String,
#[arg(long, value_name = "TYPE")]
pub r#type: Option<String>,
#[arg(long, value_name = "LAYER")]
pub r#in: Option<String>,
#[arg(long, value_name = "N")]
pub limit: Option<usize>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct FmInitArgs {
#[arg(value_name = "FILE")]
pub file: String,
#[arg(long, value_name = "STR")]
pub summary: Option<String>,
}
#[derive(Debug, Args)]
pub struct TreeArgs {
#[arg(long, value_name = "LAYER")]
pub layer: Option<String>,
#[arg(long, value_name = "TYPE")]
pub r#type: Option<String>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct StatsArgs {
#[arg(value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct OutlineArgs {
#[arg(value_name = "FILE")]
pub file: String,
}
#[derive(Debug, Args)]
pub struct IndexArgs {
#[command(subcommand)]
pub command: IndexCommand,
}
#[derive(Debug, Subcommand)]
pub enum IndexCommand {
Rebuild(IndexRebuildArgs),
Show(IndexShowArgs),
Query(IndexQueryArgs),
}
#[derive(Debug, Args)]
pub struct IndexRebuildArgs {
#[arg(long, value_name = "LAYER")]
pub layer: Option<String>,
#[arg(long, value_name = "PATH")]
pub folder: Option<String>,
#[arg(long)]
pub dry_run: bool,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct IndexShowArgs {
#[arg(value_name = "PATH")]
pub path: Option<String>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct IndexQueryArgs {
#[arg(long, value_name = "TYPE")]
pub r#type: Option<String>,
#[arg(long, value_name = "LAYER")]
pub r#in: Option<String>,
#[arg(long = "where", value_name = "K=V")]
pub r#where: Vec<String>,
#[arg(long, value_name = "RFC3339")]
pub updated_after: Option<String>,
#[arg(long, value_name = "RFC3339")]
pub updated_before: Option<String>,
#[arg(long, value_name = "RFC3339")]
pub created_after: Option<String>,
#[arg(long, value_name = "RFC3339")]
pub created_before: Option<String>,
#[arg(long, value_name = "N")]
pub limit: Option<usize>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct LogArgs {
#[command(subcommand)]
pub command: LogCommand,
}
#[derive(Debug, Subcommand)]
pub enum LogCommand {
Tail(LogTailArgs),
Since(LogSinceArgs),
#[command(external_subcommand)]
Append(Vec<String>),
}
#[derive(Debug, Args)]
pub struct LogTailArgs {
#[arg(value_name = "N", default_value_t = 20)]
pub n: usize,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct LogSinceArgs {
#[arg(value_name = "RFC3339")]
pub timestamp: String,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct WriteArgs {
#[arg(value_name = "PATH")]
pub path: String,
#[arg(long, value_name = "TYPE")]
pub r#type: String,
#[arg(long, value_name = "STR")]
pub summary: Option<String>,
#[arg(long, value_name = "K=V")]
pub fm: Vec<String>,
#[arg(long, value_name = "PATH")]
pub body_file: Option<String>,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct LinkArgs {
#[arg(value_name = "FROM")]
pub from: String,
#[arg(value_name = "TO")]
pub to: String,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct RenameArgs {
#[arg(value_name = "OLD")]
pub old: String,
#[arg(value_name = "NEW")]
pub new: String,
#[arg(long, value_name = "DIR", default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct SpecArgs {
#[arg(long, value_name = "PATH")]
pub spec: Option<String>,
}