use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Query {
Exact { word: String },
Fuzzy { word: String, distance: u8 },
FullText { text: String },
Chinese { text: String },
Wildcard { pattern: String },
}
impl Query {
pub fn user_text(&self) -> &str {
match self {
Self::Exact { word } => word,
Self::Fuzzy { word, .. } => word,
Self::FullText { text } => text,
Self::Chinese { text } => text,
Self::Wildcard { pattern } => pattern,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct SearchFilters {
pub source: Option<String>,
pub pos: Option<String>,
pub tag: Option<String>,
pub collins_min: Option<u8>,
pub freq_min: Option<u32>,
pub freq_max: Option<u32>,
pub oxford_only: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct SearchRequest {
pub query: Query,
pub filters: SearchFilters,
pub limit: usize,
pub offset: usize,
}
impl SearchRequest {
pub fn new(query: Query) -> Self {
Self {
query,
filters: SearchFilters::default(),
limit: 20,
offset: 0,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn user_text_returns_visible_query() {
assert_eq!(
Query::Fuzzy {
word: "appple".to_string(),
distance: 2
}
.user_text(),
"appple"
);
}
}