use clap::{Args, ValueEnum};
use crate::cli::SharedScopeArgs;
use talon_core::SearchMode;
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum CliSearchMode {
Hybrid,
Semantic,
Fulltext,
Title,
}
impl From<CliSearchMode> for SearchMode {
fn from(mode: CliSearchMode) -> Self {
match mode {
CliSearchMode::Hybrid => Self::Hybrid,
CliSearchMode::Semantic => Self::Semantic,
CliSearchMode::Fulltext => Self::Fulltext,
CliSearchMode::Title => Self::Title,
}
}
}
#[derive(Debug, Clone, Args)]
#[command(
about = "Search your Obsidian vault using hybrid ranking.",
long_about = r#"Search your Obsidian vault using hybrid ranking.
Combines BM25 fulltext scoring with semantic vector similarity.
The query is expanded using LLM-based context before ranking."#
)]
pub struct SearchArgs {
pub query: Vec<String>,
#[command(flatten)]
pub shared: SharedSearchArgs,
}
#[derive(Debug, Clone, Args)]
pub struct SharedSearchArgs {
#[arg(long, value_enum, ignore_case = true)]
pub mode: Option<CliSearchMode>,
#[arg(short = 'n', long)]
pub limit: Option<u16>,
#[arg(long)]
pub candidate_limit: Option<u16>,
#[arg(long)]
pub intent: Option<String>,
#[arg(long)]
pub where_: Vec<String>,
#[arg(long)]
pub since: Option<String>,
#[arg(long)]
pub anchors: bool,
#[arg(long)]
pub compact: bool,
#[command(flatten)]
pub scope: SharedScopeArgs,
}