use crate::backend::Backend;
use crate::error::LlmError;
use crate::output::{CallMatch, ReferenceMatch, SymbolMatch};
use crate::query::{
AstOptions, ContextOptions, DepthOptions, FqnOptions, MetricsOptions, SearchOptions,
SnippetOptions,
};
use crate::SortMode;
use std::path::Path;
pub fn search_symbols(
query: &str,
db_path: &Path,
limit: usize,
) -> Result<Vec<SymbolMatch>, LlmError> {
let backend = Backend::detect_and_open(db_path)?;
let options = SearchOptions {
db_path,
query,
path_filter: None,
kind_filter: None,
language_filter: None,
limit,
use_regex: false,
candidates: limit * 10,
context: ContextOptions::default(),
snippet: SnippetOptions::default(),
fqn: FqnOptions {
fqn: true,
canonical_fqn: true,
display_fqn: false,
},
include_score: false,
sort_by: SortMode::default(),
metrics: MetricsOptions::default(),
ast: AstOptions::default(),
depth: DepthOptions::default(),
algorithm: Default::default(),
symbol_id: None,
fqn_pattern: None,
exact_fqn: None,
coverage_filter: None,
};
let (response, _, _) = backend.search_symbols(options)?;
Ok(response.results)
}
pub fn search_symbols_regex(
pattern: &str,
db_path: &Path,
limit: usize,
) -> Result<Vec<SymbolMatch>, LlmError> {
let backend = Backend::detect_and_open(db_path)?;
let options = SearchOptions {
db_path,
query: pattern,
path_filter: None,
kind_filter: None,
language_filter: None,
limit,
use_regex: true,
candidates: limit * 10,
context: ContextOptions::default(),
snippet: SnippetOptions::default(),
fqn: FqnOptions {
fqn: true,
canonical_fqn: true,
display_fqn: false,
},
include_score: false,
sort_by: SortMode::default(),
metrics: MetricsOptions::default(),
ast: AstOptions::default(),
depth: DepthOptions::default(),
algorithm: Default::default(),
symbol_id: None,
fqn_pattern: None,
exact_fqn: None,
coverage_filter: None,
};
let (response, _, _) = backend.search_symbols(options)?;
Ok(response.results)
}
pub fn search_references(
symbol_name: &str,
db_path: &Path,
limit: usize,
) -> Result<Vec<ReferenceMatch>, LlmError> {
let backend = Backend::detect_and_open(db_path)?;
let options = SearchOptions {
db_path,
query: symbol_name,
path_filter: None,
kind_filter: None,
language_filter: None,
limit,
use_regex: false,
candidates: limit * 10,
context: ContextOptions::default(),
snippet: SnippetOptions::default(),
fqn: FqnOptions::default(),
include_score: false,
sort_by: SortMode::default(),
metrics: MetricsOptions::default(),
ast: AstOptions::default(),
depth: DepthOptions::default(),
algorithm: Default::default(),
symbol_id: None,
fqn_pattern: None,
exact_fqn: None,
coverage_filter: None,
};
let (response, _) = backend.search_references(options)?;
Ok(response.results)
}
pub fn search_calls(
symbol_name: &str,
db_path: &Path,
limit: usize,
) -> Result<Vec<CallMatch>, LlmError> {
let backend = Backend::detect_and_open(db_path)?;
let options = SearchOptions {
db_path,
query: symbol_name,
path_filter: None,
kind_filter: None,
language_filter: None,
limit,
use_regex: false,
candidates: limit * 10,
context: ContextOptions::default(),
snippet: SnippetOptions::default(),
fqn: FqnOptions::default(),
include_score: false,
sort_by: SortMode::default(),
metrics: MetricsOptions::default(),
ast: AstOptions::default(),
depth: DepthOptions::default(),
algorithm: Default::default(),
symbol_id: None,
fqn_pattern: None,
exact_fqn: None,
coverage_filter: None,
};
let (response, _) = backend.search_calls(options)?;
Ok(response.results)
}
pub fn lookup_symbol(fqn: &str, db_path: &Path) -> Result<SymbolMatch, LlmError> {
let backend = Backend::detect_and_open(db_path)?;
backend.lookup(fqn, db_path.to_str().unwrap_or("."))
}
pub fn search_symbols_by_language(
query: &str,
language: &str,
db_path: &Path,
limit: usize,
) -> Result<Vec<SymbolMatch>, LlmError> {
let backend = Backend::detect_and_open(db_path)?;
let options = SearchOptions {
db_path,
query,
path_filter: None,
kind_filter: None,
language_filter: Some(language),
limit,
use_regex: false,
candidates: limit * 10,
context: ContextOptions::default(),
snippet: SnippetOptions::default(),
fqn: FqnOptions {
fqn: true,
canonical_fqn: true,
display_fqn: false,
},
include_score: false,
sort_by: SortMode::default(),
metrics: MetricsOptions::default(),
ast: AstOptions::default(),
depth: DepthOptions::default(),
algorithm: Default::default(),
symbol_id: None,
fqn_pattern: None,
exact_fqn: None,
coverage_filter: None,
};
let (response, _, _) = backend.search_symbols(options)?;
Ok(response.results)
}