mod cmd_derive;
mod cmd_haiku;
mod cmd_list;
mod cmd_merge;
mod cmd_query;
mod cmd_render;
mod cmd_track;
mod cmd_validate;
use anyhow::Result;
use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "path", version)]
#[command(about = "Derive, query, and visualize Toolpath provenance documents")]
struct Cli {
#[command(subcommand)]
command: Commands,
#[arg(long, global = true)]
pretty: bool,
}
#[derive(Subcommand, Debug)]
enum Commands {
List {
#[command(subcommand)]
source: cmd_list::ListSource,
#[arg(long, global = true)]
json: bool,
},
Derive {
#[command(subcommand)]
source: cmd_derive::DeriveSource,
},
Query {
#[command(subcommand)]
op: cmd_query::QueryOp,
},
Render {
#[command(subcommand)]
format: cmd_render::RenderFormat,
},
Merge {
#[arg(required = true)]
inputs: Vec<String>,
#[arg(long)]
title: Option<String>,
},
Track {
#[command(subcommand)]
op: cmd_track::TrackOp,
},
Validate {
#[arg(short, long)]
input: PathBuf,
},
Haiku,
}
fn main() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Commands::List { source, json } => cmd_list::run(source, json),
Commands::Derive { source } => cmd_derive::run(source, cli.pretty),
Commands::Query { op } => cmd_query::run(op, cli.pretty),
Commands::Render { format } => cmd_render::run(format),
Commands::Merge { inputs, title } => cmd_merge::run(inputs, title, cli.pretty),
Commands::Track { op } => cmd_track::run(op, cli.pretty),
Commands::Validate { input } => cmd_validate::run(input),
Commands::Haiku => {
cmd_haiku::run();
Ok(())
}
}
}