use std::collections::BTreeMap;
use crate::error::{CoreError, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum SearchFieldMode {
Prefix,
Contains,
Exact,
}
impl SearchFieldMode {
pub fn from_token(token: &str) -> Result<Self> {
match token {
"prefix" => Ok(Self::Prefix),
"contains" => Ok(Self::Contains),
"exact" => Ok(Self::Exact),
other => Err(CoreError::Search {
message: format!("unknown search mode: {other}"),
}),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum FuzzyMode {
Exact,
Fuzzy,
TokenSort,
}
impl FuzzyMode {
pub fn from_token(token: &str) -> Result<Self> {
match token {
"exact" => Ok(Self::Exact),
"fuzzy" => Ok(Self::Fuzzy),
"token_sort" => Ok(Self::TokenSort),
other => Err(CoreError::Search {
message: format!("unknown fuzzy mode: {other}"),
}),
}
}
}
#[derive(Debug, Clone)]
pub struct SearchSpec {
pub query: String,
pub fields: Vec<String>,
pub weights: Option<BTreeMap<String, f64>>,
pub mode: SearchFieldMode,
pub fuzzy: FuzzyMode,
pub threshold: i64,
pub min_length: usize,
pub max_results: Option<usize>,
}