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}