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 commands::JournalArgs;
13use helpers::{
14 create_and_init_vault, load_and_resolve_workspace, load_settings, resolve_quick_note_path,
15};
16use kimun_core::NoteVault;
17use output::OutputFormat;
18
19#[derive(Subcommand)]
20pub enum CliCommand {
21 Search {
23 query: String,
24 #[arg(long, value_enum, default_value = "text")]
25 format: OutputFormat,
26 },
27 Notes {
29 #[arg(long, help = "Filter notes by path prefix")]
30 path: Option<String>,
31 #[arg(long, value_enum, default_value = "text")]
32 format: OutputFormat,
33 },
34 Workspace {
36 #[command(subcommand)]
37 subcommand: WorkspaceSubcommand,
38 },
39 Note {
41 #[command(subcommand)]
42 subcommand: NoteSubcommand,
43 },
44 Journal(JournalArgs),
46}
47
48pub async fn run_cli(command: CliCommand, config_path: Option<std::path::PathBuf>) -> Result<()> {
49 match command {
50 CliCommand::Workspace { subcommand } => {
51 let mut settings = load_settings(config_path)?;
52 commands::workspace::run(subcommand, &mut settings).await
53 }
54 CliCommand::Note { subcommand } => {
55 let (settings, workspace_path, workspace_name) =
56 load_and_resolve_workspace(config_path)?;
57 let quick_note_path = resolve_quick_note_path(&settings);
58 let vault = NoteVault::new(&workspace_path).await?;
59 match vault.validate().await? {
60 kimun_core::db::DBStatus::Ready => {
61 commands::note_ops::run(subcommand, &vault, &quick_note_path, &workspace_name)
62 .await
63 }
64 status => Err(eyre!(
65 "Workspace index is not ready ({status}).\nRun `kimun workspace reindex` to initialise it."
66 )),
67 }
68 }
69 CliCommand::Search { query, format } => {
70 let (vault, workspace_name) = create_and_init_vault(config_path).await?;
71 commands::search::run(&vault, &query, format, &workspace_name, false).await
72 }
73 CliCommand::Notes { path, format } => {
74 let (vault, workspace_name) = create_and_init_vault(config_path).await?;
75 commands::notes::run(&vault, path.as_deref(), format, &workspace_name, false).await
76 }
77 CliCommand::Journal(args) => {
78 let (vault, workspace_name) = create_and_init_vault(config_path).await?;
79 commands::journal::run(args, &vault, &workspace_name).await
80 }
81 }
82}