Skip to main content

dictx_core/
query.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
4pub enum Query {
5    Exact { word: String },
6    Fuzzy { word: String, distance: u8 },
7    FullText { text: String },
8    Chinese { text: String },
9    Wildcard { pattern: String },
10}
11
12impl Query {
13    pub fn user_text(&self) -> &str {
14        match self {
15            Self::Exact { word } => word,
16            Self::Fuzzy { word, .. } => word,
17            Self::FullText { text } => text,
18            Self::Chinese { text } => text,
19            Self::Wildcard { pattern } => pattern,
20        }
21    }
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
25pub struct SearchFilters {
26    pub source: Option<String>,
27    pub pos: Option<String>,
28    pub tag: Option<String>,
29    pub collins_min: Option<u8>,
30    pub freq_min: Option<u32>,
31    pub freq_max: Option<u32>,
32    pub oxford_only: bool,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
36pub struct SearchRequest {
37    pub query: Query,
38    pub filters: SearchFilters,
39    pub limit: usize,
40    pub offset: usize,
41}
42
43impl SearchRequest {
44    pub fn new(query: Query) -> Self {
45        Self {
46            query,
47            filters: SearchFilters::default(),
48            limit: 20,
49            offset: 0,
50        }
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn user_text_returns_visible_query() {
60        assert_eq!(
61            Query::Fuzzy {
62                word: "appple".to_string(),
63                distance: 2
64            }
65            .user_text(),
66            "appple"
67        );
68    }
69}