os_query_builder_rs/term/
term.rs1use 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}