os_query_builder_rs/term/
term.rs

1use serde::{Serialize, Serializer, ser::SerializeMap};
2use super::term_type::TermType;
3
4#[derive(Debug, Clone)]
5pub struct Term {   
6    field: String,
7    value: TermInner,
8}
9
10#[derive(Debug, Clone, Serialize)]
11struct TermInner {   
12    value: TermType,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    boost: Option<f64>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    case_insensitive: Option<bool>
17}
18
19impl Term {
20
21    pub fn new<T,F>(field: T, value: F) -> Self 
22        where T: Into<String>,
23            F: Into<TermType>
24    {
25        Self {
26            field: field.into(),
27            value: TermInner{
28                value: value.into(),
29                boost: None,
30                case_insensitive: None
31            }
32        }
33    }
34    
35    pub fn boost<T:Into<f64>>(self, boost: T) -> Self {
36        Self {
37            value:  TermInner {
38                boost: Some(boost.into()),
39                    ..self.value
40            },
41            ..self
42        }
43    }
44    
45    pub fn case_insensitive<T:Into<bool>>(self, case_insensitive: T) -> Self {
46        Self {
47            value:  TermInner {
48                case_insensitive: Some(case_insensitive.into()),
49                    ..self.value
50            },
51            ..self
52        }
53    }
54}
55
56impl Serialize for Term {
57    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
58        where
59            S: Serializer,
60    {
61        let mut state = serializer.serialize_map(Some(1))?;
62        state.serialize_entry(&self.field, &self.value)?;
63        state.end()
64    }
65}