#![allow(dead_code)]
mod cli;
mod cmd;
mod context;
mod error;
use clap::Parser;
use crate::cli::{Cli, Command};
use crate::context::Context;
use crate::error::{CliError, CliResult, ExitCode};
fn main() {
let cli = Cli::parse();
let ctx = Context {
json: cli.json,
color: cli.color,
};
let result = dispatch(&ctx, &cli.command);
match result {
Ok(()) => std::process::exit(ExitCode::Success.code()),
Err(err) => {
emit_error(&ctx, &err);
std::process::exit(err.exit.code());
}
}
}
fn dispatch(ctx: &Context, command: &Command) -> CliResult {
match command {
Command::Validate(args) => cmd::validate::run(ctx, args),
Command::Format(args) => cmd::format::run(ctx, args),
Command::Query(args) => cmd::query::run(ctx, args),
Command::Links(args) => cmd::links::run(ctx, args),
Command::Sections(args) => cmd::sections::run(ctx, args),
Command::Extract(args) => cmd::extract::run(ctx, args),
Command::Search(args) => cmd::search::run(ctx, args),
Command::Graph(args) => cmd::graph::run(ctx, args),
Command::Fm(args) => cmd::fm::run(ctx, args),
Command::Tree(args) => cmd::tree::run(ctx, args),
Command::Stats(args) => cmd::stats::run(ctx, args),
Command::Outline(args) => cmd::outline::run(ctx, args),
Command::Index(args) => cmd::index::run(ctx, args),
Command::Log(args) => cmd::log::run(ctx, args),
Command::Write(args) => cmd::write::run(ctx, args),
Command::Link(args) => cmd::link::run(ctx, args),
Command::Rename(args) => cmd::rename::run(ctx, args),
Command::Spec(args) => cmd::spec::run(ctx, args),
}
}
fn emit_error(ctx: &Context, err: &CliError) {
if ctx.json {
eprintln!("{}", err.to_json());
} else {
eprintln!("dbmd: {}", err.message);
if let Some(hint) = &err.hint {
eprintln!(" hint: {hint}");
}
}
}