1use crate::error::Error;
4use serde::ser;
5use std::marker::PhantomData;
6
7use crate::float::{FloatPolicy, FloatRepr, RejectFloatPolicy};
8use crate::key::{Float, Key};
9
10pub fn to_key<T>(value: &T) -> Result<Key<RejectFloatPolicy>, Error>
48where
49 T: ser::Serialize,
50{
51 to_key_with_policy::<T, RejectFloatPolicy>(value)
52}
53
54pub(crate) fn to_key_with_policy<T, F>(value: &T) -> Result<Key<F>, Error>
56where
57 T: ser::Serialize,
58 F: FloatPolicy,
59{
60 value.serialize(Serializer(PhantomData))
61}
62
63struct Serializer<F>(PhantomData<F>)
64where
65 F: FloatPolicy;
66
67impl<F> ser::Serializer for Serializer<F>
68where
69 F: FloatPolicy,
70{
71 type Ok = Key<F>;
72 type Error = Error;
73
74 type SerializeSeq = SerializeVec<F>;
75 type SerializeTuple = SerializeVec<F>;
76 type SerializeTupleStruct = SerializeVec<F>;
77 type SerializeTupleVariant = SerializeTupleVariant<F>;
78 type SerializeMap = SerializeMap<F>;
79 type SerializeStruct = SerializeMap<F>;
80 type SerializeStructVariant = SerializeStructVariant<F>;
81
82 #[inline]
83 fn serialize_bool(self, value: bool) -> Result<Key<F>, Error> {
84 Ok(Key::Bool(value))
85 }
86
87 #[inline]
88 fn serialize_i8(self, value: i8) -> Result<Key<F>, Error> {
89 Ok(value.into())
90 }
91
92 #[inline]
93 fn serialize_i16(self, value: i16) -> Result<Key<F>, Error> {
94 Ok(value.into())
95 }
96
97 #[inline]
98 fn serialize_i32(self, value: i32) -> Result<Key<F>, Error> {
99 Ok(value.into())
100 }
101
102 #[inline]
103 fn serialize_i64(self, value: i64) -> Result<Key<F>, Error> {
104 Ok(value.into())
105 }
106
107 fn serialize_i128(self, value: i128) -> Result<Key<F>, Error> {
108 Ok(value.into())
109 }
110
111 #[inline]
112 fn serialize_u8(self, value: u8) -> Result<Key<F>, Error> {
113 Ok(value.into())
114 }
115
116 #[inline]
117 fn serialize_u16(self, value: u16) -> Result<Key<F>, Error> {
118 Ok(value.into())
119 }
120
121 #[inline]
122 fn serialize_u32(self, value: u32) -> Result<Key<F>, Error> {
123 Ok(value.into())
124 }
125
126 #[inline]
127 fn serialize_u64(self, value: u64) -> Result<Key<F>, Error> {
128 Ok(value.into())
129 }
130
131 #[inline]
132 fn serialize_u128(self, value: u128) -> Result<Key<F>, Error> {
133 Ok(value.into())
134 }
135
136 #[inline]
137 fn serialize_f32(self, value: f32) -> Result<Key<F>, Error> {
138 Ok(Key::Float(Float::F32(
139 <F::F32 as FloatRepr<f32>>::serialize(value)?,
140 )))
141 }
142
143 #[inline]
144 fn serialize_f64(self, value: f64) -> Result<Key<F>, Error> {
145 Ok(Key::Float(Float::F64(
146 <F::F64 as FloatRepr<f64>>::serialize(value)?,
147 )))
148 }
149
150 #[inline]
151 fn serialize_char(self, value: char) -> Result<Key<F>, Error> {
152 let mut s = String::new();
153 s.push(value);
154 self.serialize_str(&s)
155 }
156
157 #[inline]
158 fn serialize_str(self, value: &str) -> Result<Key<F>, Error> {
159 Ok(Key::String(value.into()))
160 }
161
162 #[inline]
163 fn serialize_bytes(self, value: &[u8]) -> Result<Key<F>, Error> {
164 Ok(Key::Bytes(value.into()))
165 }
166
167 #[inline]
168 fn serialize_unit(self) -> Result<Key<F>, Error> {
169 Ok(Key::Unit)
170 }
171
172 #[inline]
173 fn serialize_unit_struct(self, _name: &'static str) -> Result<Key<F>, Error> {
174 self.serialize_unit()
175 }
176
177 #[inline]
178 fn serialize_unit_variant(
179 self,
180 _name: &'static str,
181 _variant_index: u32,
182 variant: &'static str,
183 ) -> Result<Key<F>, Error> {
184 self.serialize_str(variant)
185 }
186
187 #[inline]
188 fn serialize_newtype_struct<T: ?Sized>(
189 self,
190 _name: &'static str,
191 value: &T,
192 ) -> Result<Key<F>, Error>
193 where
194 T: ser::Serialize,
195 {
196 value.serialize(self)
197 }
198
199 fn serialize_newtype_variant<T: ?Sized>(
200 self,
201 _name: &'static str,
202 _variant_index: u32,
203 variant: &'static str,
204 value: &T,
205 ) -> Result<Key<F>, Error>
206 where
207 T: ser::Serialize,
208 {
209 let value = (Key::from(variant.to_owned()), to_key_with_policy(&value)?);
210 Ok(Key::Map([value].into()))
211 }
212
213 #[inline]
214 fn serialize_none(self) -> Result<Key<F>, Error> {
215 self.serialize_unit()
216 }
217
218 #[inline]
219 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Key<F>, Error>
220 where
221 T: ser::Serialize,
222 {
223 value.serialize(self)
224 }
225
226 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
227 Ok(SerializeVec {
228 vec: Vec::with_capacity(len.unwrap_or(0)),
229 })
230 }
231
232 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Error> {
233 self.serialize_seq(Some(len))
234 }
235
236 fn serialize_tuple_struct(
237 self,
238 _name: &'static str,
239 len: usize,
240 ) -> Result<Self::SerializeTupleStruct, Error> {
241 self.serialize_tuple(len)
242 }
243
244 fn serialize_tuple_variant(
245 self,
246 _name: &'static str,
247 _variant_index: u32,
248 variant: &'static str,
249 len: usize,
250 ) -> Result<Self::SerializeTupleVariant, Error> {
251 Ok(SerializeTupleVariant {
252 name: String::from(variant),
253 vec: Vec::with_capacity(len),
254 })
255 }
256
257 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
258 Ok(SerializeMap {
259 map: Vec::new(),
260 next_key: None,
261 })
262 }
263
264 fn serialize_struct(
265 self,
266 _name: &'static str,
267 len: usize,
268 ) -> Result<Self::SerializeStruct, Error> {
269 self.serialize_map(Some(len))
270 }
271
272 fn serialize_struct_variant(
273 self,
274 _name: &'static str,
275 _variant_index: u32,
276 variant: &'static str,
277 _len: usize,
278 ) -> Result<Self::SerializeStructVariant, Error> {
279 Ok(SerializeStructVariant {
280 name: String::from(variant),
281 map: Vec::new(),
282 })
283 }
284
285 #[inline]
286 fn is_human_readable(&self) -> bool {
287 false
288 }
289}
290
291pub struct SerializeVec<F>
292where
293 F: FloatPolicy,
294{
295 vec: Vec<Key<F>>,
296}
297
298pub struct SerializeTupleVariant<F>
299where
300 F: FloatPolicy,
301{
302 name: String,
303 vec: Vec<Key<F>>,
304}
305
306pub struct SerializeMap<F>
307where
308 F: FloatPolicy,
309{
310 map: Vec<(Key<F>, Key<F>)>,
311 next_key: Option<Key<F>>,
312}
313
314pub struct SerializeStructVariant<F>
315where
316 F: FloatPolicy,
317{
318 name: String,
319 map: Vec<(Key<F>, Key<F>)>,
320}
321
322impl<F> ser::SerializeSeq for SerializeVec<F>
323where
324 F: FloatPolicy,
325{
326 type Ok = Key<F>;
327 type Error = Error;
328
329 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
330 where
331 T: ser::Serialize,
332 {
333 self.vec.push(to_key_with_policy(&value)?);
334 Ok(())
335 }
336
337 fn end(self) -> Result<Key<F>, Error> {
338 Ok(Key::Seq(self.vec.into()))
339 }
340}
341
342impl<F> ser::SerializeTuple for SerializeVec<F>
343where
344 F: FloatPolicy,
345{
346 type Ok = Key<F>;
347 type Error = Error;
348
349 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
350 where
351 T: ser::Serialize,
352 {
353 ser::SerializeSeq::serialize_element(self, value)
354 }
355
356 fn end(self) -> Result<Key<F>, Error> {
357 ser::SerializeSeq::end(self)
358 }
359}
360
361impl<F> ser::SerializeTupleStruct for SerializeVec<F>
362where
363 F: FloatPolicy,
364{
365 type Ok = Key<F>;
366 type Error = Error;
367
368 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
369 where
370 T: ser::Serialize,
371 {
372 ser::SerializeSeq::serialize_element(self, value)
373 }
374
375 fn end(self) -> Result<Key<F>, Error> {
376 ser::SerializeSeq::end(self)
377 }
378}
379
380impl<F> ser::SerializeTupleVariant for SerializeTupleVariant<F>
381where
382 F: FloatPolicy,
383{
384 type Ok = Key<F>;
385 type Error = Error;
386
387 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
388 where
389 T: ser::Serialize,
390 {
391 self.vec.push(to_key_with_policy(&value)?);
392 Ok(())
393 }
394
395 fn end(self) -> Result<Key<F>, Error> {
396 let value = (Key::from(self.name), Key::Seq(self.vec.into()));
397 Ok(Key::Map([value].into()))
398 }
399}
400
401impl<F> ser::SerializeMap for SerializeMap<F>
402where
403 F: FloatPolicy,
404{
405 type Ok = Key<F>;
406 type Error = Error;
407
408 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Error>
409 where
410 T: ser::Serialize,
411 {
412 self.next_key = Some(to_key_with_policy(&key)?);
413 Ok(())
414 }
415
416 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
417 where
418 T: ser::Serialize,
419 {
420 let key = match self.next_key.take() {
421 Some(key) => key,
422 None => return Err(Error::MissingValue),
423 };
424
425 self.map.push((key, to_key_with_policy(&value)?));
426 Ok(())
427 }
428
429 fn end(self) -> Result<Key<F>, Error> {
430 Ok(Key::Map(self.map.into()))
431 }
432}
433
434impl<F> ser::SerializeStruct for SerializeMap<F>
435where
436 F: FloatPolicy,
437{
438 type Ok = Key<F>;
439 type Error = Error;
440
441 fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
442 where
443 T: ser::Serialize,
444 {
445 ser::SerializeMap::serialize_key(self, key)?;
446 ser::SerializeMap::serialize_value(self, value)
447 }
448
449 fn end(self) -> Result<Key<F>, Error> {
450 ser::SerializeMap::end(self)
451 }
452}
453
454impl<F> ser::SerializeStructVariant for SerializeStructVariant<F>
455where
456 F: FloatPolicy,
457{
458 type Ok = Key<F>;
459 type Error = Error;
460
461 fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
462 where
463 T: ser::Serialize,
464 {
465 self.map
466 .push((Key::from(String::from(key)), to_key_with_policy(&value)?));
467 Ok(())
468 }
469
470 fn end(self) -> Result<Key<F>, Error> {
471 let value = (Key::from(self.name), Key::Map(self.map.into()));
472 Ok(Key::Map([value].into()))
473 }
474}