elastic_types/boolean/
impls.rs1use 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#[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 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 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}