1pub mod commands;
3pub mod helpers;
4pub mod json_output;
5pub mod metadata_extractor;
6pub mod output;
7
8use clap::Subcommand;
9use color_eyre::eyre::{Result, eyre};
10use commands::note_ops::NoteSubcommand;
11use commands::workspace::WorkspaceSubcommand;
12use helpers::{
13 create_and_init_vault, load_and_resolve_workspace, load_settings, resolve_quick_note_path,
14};
15use kimun_core::NoteVault;
16use output::OutputFormat;
17
18#[derive(Subcommand)]
19pub enum CliCommand {
20 Search {
22 query: String,
23 #[arg(long, value_enum, default_value = "text")]
24 format: OutputFormat,
25 },
26 Notes {
28 #[arg(long, help = "Filter notes by path prefix")]
29 path: Option<String>,
30 #[arg(long, value_enum, default_value = "text")]
31 format: OutputFormat,
32 },
33 Workspace {
35 #[command(subcommand)]
36 subcommand: WorkspaceSubcommand,
37 },
38 Note {
40 #[command(subcommand)]
41 subcommand: NoteSubcommand,
42 },
43}
44
45pub async fn run_cli(command: CliCommand, config_path: Option<std::path::PathBuf>) -> Result<()> {
46 match command {
47 CliCommand::Workspace { subcommand } => {
48 let mut settings = load_settings(config_path)?;
49 commands::workspace::run(subcommand, &mut settings).await
50 }
51 CliCommand::Note { subcommand } => {
52 let (settings, workspace_path, workspace_name) =
53 load_and_resolve_workspace(config_path)?;
54 let quick_note_path = resolve_quick_note_path(&settings);
55 let vault = NoteVault::new(&workspace_path).await?;
56 match vault.validate().await? {
57 kimun_core::db::DBStatus::Ready => {
58 commands::note_ops::run(subcommand, &vault, &quick_note_path, &workspace_name)
59 .await
60 }
61 status => Err(eyre!(
62 "Workspace index is not ready ({status}).\nRun `kimun workspace reindex` to initialise it."
63 )),
64 }
65 }
66 CliCommand::Search { query, format } => {
67 let (vault, workspace_name) = create_and_init_vault(config_path).await?;
68 commands::search::run(&vault, &query, format, &workspace_name, false).await
69 }
70 CliCommand::Notes { path, format } => {
71 let (vault, workspace_name) = create_and_init_vault(config_path).await?;
72 commands::notes::run(&vault, path.as_deref(), format, &workspace_name, false).await
73 }
74 }
75}