os_query_builder_rs/term/
fuzzy.rs1use serde::{
2 Serialize,
3 Serializer,
4 ser::SerializeMap
5};
6use crate::misc::{
7 fuzziness::Fuzziness,
8 rewrite::Rewrite
9};
10
11#[derive(Debug, Default, Clone)]
12pub struct Fuzzy {
13 field: Option<String>,
14 value: FuzzyValue
15
16}
17
18#[derive(Debug, Default, Clone, Serialize)]
19struct FuzzyValue {
20 value: String,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 boost: Option<f64>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 fuzziness: Option<Fuzziness>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 max_expansions: Option<u64>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 prefix_length: Option<u64>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 rewrite: Option<Rewrite>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 transpositions: Option<bool>
33}
34
35impl Serialize for Fuzzy {
36 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
37 where
38 S: Serializer,
39 {
40 let mut state = serializer.serialize_map(Some(1))?;
41 state.serialize_entry(&self.field.as_deref().unwrap_or_default(), &self.value)?;
42 state.end()
43 }
44}
45
46impl Fuzzy {
47 pub fn new() -> Self {
48 Self::default()
49 }
50
51 pub fn field<T: Into<String> + Serialize>(self, field: T ) -> Self {
52 Self {
53 field: Some(field.into()),
54 ..self
55 }
56 }
57
58 pub fn value<T: Into<String> + Serialize>(self, value: T ) -> Self {
59 Self {
60 value: FuzzyValue {
61 value: value.into(),
62 ..self.value
63 },
64 ..self
65 }
66 }
67
68 pub fn boost<T: Into<f64> + Serialize>(self, boost: T ) -> Self {
69 Self {
70 value: FuzzyValue {
71 boost: Some(boost.into()),
72 ..self.value
73 },
74 ..self
75 }
76 }
77
78 pub fn fuzziness<T: Into<Fuzziness> + Serialize>(self, fuzziness: T ) -> Self {
79 Self {
80 value: FuzzyValue {
81 fuzziness: Some(fuzziness.into()),
82 ..self.value
83 },
84 ..self
85 }
86 }
87
88 pub fn max_expansions<T: Into<u64> + Serialize>(self, max_expansions: T ) -> Self {
89 Self {
90 value: FuzzyValue {
91 max_expansions: Some(max_expansions.into()),
92 ..self.value
93 },
94 ..self
95 }
96 }
97
98 pub fn prefix_length<T: Into<u64> + Serialize>(self, prefix_length: T ) -> Self {
99 Self {
100 value: FuzzyValue {
101 prefix_length: Some(prefix_length.into()),
102 ..self.value
103 },
104 ..self
105 }
106 }
107
108 pub fn rewrite<T: Into<Rewrite> + Serialize>(self, rewrite: T ) -> Self {
109 Self {
110 value: FuzzyValue {
111 rewrite: Some(rewrite.into()),
112 ..self.value
113 },
114 ..self
115 }
116 }
117
118 pub fn transpositions<T: Into<bool> + Serialize>(self, transpositions: T ) -> Self {
119 Self {
120 value: FuzzyValue {
121 transpositions: Some(transpositions.into()),
122 ..self.value
123 },
124 ..self
125 }
126 }
127}