elastic_types/boolean/
impls.rs

1use std::borrow::Borrow;
2use std::marker::PhantomData;
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use serde::de::{Error, Visitor};
5use super::mapping::{BooleanFieldType, BooleanMapping, DefaultBooleanMapping};
6
7impl BooleanFieldType<DefaultBooleanMapping> for bool {}
8
9/**
10An Elasticsearch `boolean` with a mapping.
11
12Where the mapping isn't custom, you can use the standard library `bool` instead.
13
14# Examples
15
16Defining a `bool` with a mapping:
17
18```
19# use elastic_types::prelude::*;
20let boolean = Boolean::<DefaultBooleanMapping>::new(true);
21```
22*/
23#[derive(Debug, Clone, Default, PartialEq)]
24pub struct Boolean<TMapping>
25where
26    TMapping: BooleanMapping,
27{
28    value: bool,
29    _m: PhantomData<TMapping>,
30}
31
32impl<TMapping> Boolean<TMapping>
33where
34    TMapping: BooleanMapping,
35{
36    /**
37    Creates a new `Boolean` with the given mapping.
38    
39    # Examples
40    
41    Create a new `Boolean` from a `bool`:
42    
43    ```
44    # use elastic_types::prelude::*;
45    let boolean = Boolean::<DefaultBooleanMapping>::new(false);
46    ```
47    */
48    pub fn new<I>(boolean: I) -> Boolean<TMapping>
49    where
50        I: Into<bool>,
51    {
52        Boolean {
53            value: boolean.into(),
54            _m: PhantomData,
55        }
56    }
57
58    /**
59    Change the mapping of this boolean.
60    
61    # Examples
62    
63    Change the mapping for a given `Boolean`:
64    
65    ```
66    # extern crate serde;
67    # #[macro_use]
68    # extern crate elastic_types;
69    # fn main() {
70    # use elastic_types::prelude::*;
71    # #[derive(Default)]
72    # struct MyBooleanMapping;
73    # impl BooleanMapping for MyBooleanMapping { }
74    let boolean = Boolean::<DefaultBooleanMapping>::new(true);
75    
76    let boolean: Boolean<MyBooleanMapping> = Boolean::remap(boolean);
77    # }
78    ```
79    */
80    pub fn remap<TNewMapping>(boolean: Boolean<TMapping>) -> Boolean<TNewMapping>
81    where
82        TNewMapping: BooleanMapping,
83    {
84        Boolean::<TNewMapping>::new(boolean.value)
85    }
86}
87
88impl<TMapping> BooleanFieldType<TMapping> for Boolean<TMapping>
89where
90    TMapping: BooleanMapping,
91{
92}
93
94impl_mapping_type!(bool, Boolean, BooleanMapping);
95
96impl<TMapping> Serialize for Boolean<TMapping>
97where
98    TMapping: BooleanMapping,
99{
100    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
101    where
102        S: Serializer,
103    {
104        serializer.serialize_bool(self.value)
105    }
106}
107
108impl<'de, TMapping> Deserialize<'de> for Boolean<TMapping>
109where
110    TMapping: BooleanMapping,
111{
112    fn deserialize<D>(deserializer: D) -> Result<Boolean<TMapping>, D::Error>
113    where
114        D: Deserializer<'de>,
115    {
116        #[derive(Default)]
117        struct BooleanVisitor<TMapping> {
118            _m: PhantomData<TMapping>,
119        }
120
121        impl<'de, TMapping> Visitor<'de> for BooleanVisitor<TMapping>
122        where
123            TMapping: BooleanMapping,
124        {
125            type Value = Boolean<TMapping>;
126
127            fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
128                write!(formatter, "a json boolean")
129            }
130
131            fn visit_bool<E>(self, v: bool) -> Result<Boolean<TMapping>, E>
132            where
133                E: Error,
134            {
135                Ok(Boolean::<TMapping>::new(v))
136            }
137        }
138
139        deserializer.deserialize_any(BooleanVisitor::<TMapping>::default())
140    }
141}
142
143#[cfg(test)]
144mod tests {
145    use serde_json;
146
147    use prelude::*;
148
149    #[derive(Default)]
150    struct MyBooleanMapping;
151    impl BooleanMapping for MyBooleanMapping {}
152
153    #[test]
154    fn can_change_boolean_mapping() {
155        fn takes_custom_mapping(_: Boolean<MyBooleanMapping>) -> bool {
156            true
157        }
158
159        let boolean: Boolean<DefaultBooleanMapping> = Boolean::new(true);
160
161        assert!(takes_custom_mapping(Boolean::remap(boolean)));
162    }
163
164    #[test]
165    fn serialise_elastic_boolean() {
166        let boolean: Boolean<DefaultBooleanMapping> = Boolean::new(true);
167
168        let ser = serde_json::to_string(&boolean).unwrap();
169
170        assert_eq!("true", ser);
171    }
172
173    #[test]
174    fn deserialise_elastic_boolean() {
175        let boolean: Boolean<DefaultBooleanMapping> = serde_json::from_str("true").unwrap();
176
177        assert_eq!(true, boolean);
178    }
179
180}