os_query_builder_rs/term/
fuzzy.rs

1use 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}