1use core::cell::Cell;
2use core::fmt::Display;
3use core::marker::PhantomData;
4use core::ops::{Deref, DerefMut};
5use serde::ser::{
6 SerializeMap,
7 SerializeSeq,
8 SerializeStruct,
9 SerializeStructVariant,
10 SerializeTuple,
11 SerializeTupleStruct,
12 SerializeTupleVariant
13};
14use serde::{Deserialize, Deserializer, Serialize, Serializer};
15
16pub trait Alter: AlterRest {
24 fn alter_bool<S: Serializer>(ser: S, v: bool) -> Result<S::Ok, S::Error> {
26 ser.serialize_bool(v)
27 }
28
29 fn alter_i8<S: Serializer>(ser: S, v: i8) -> Result<S::Ok, S::Error> {
31 ser.serialize_i8(v)
32 }
33
34 fn alter_i16<S: Serializer>(ser: S, v: i16) -> Result<S::Ok, S::Error> {
36 ser.serialize_i16(v)
37 }
38
39 fn alter_i32<S: Serializer>(ser: S, v: i32) -> Result<S::Ok, S::Error> {
41 ser.serialize_i32(v)
42 }
43
44 fn alter_i64<S: Serializer>(ser: S, v: i64) -> Result<S::Ok, S::Error> {
46 ser.serialize_i64(v)
47 }
48
49 fn alter_i128<S: Serializer>(ser: S, v: i128) -> Result<S::Ok, S::Error> {
51 ser.serialize_i128(v)
52 }
53
54 fn alter_u8<S: Serializer>(ser: S, v: u8) -> Result<S::Ok, S::Error> {
56 ser.serialize_u8(v)
57 }
58
59 fn alter_u16<S: Serializer>(ser: S, v: u16) -> Result<S::Ok, S::Error> {
61 ser.serialize_u16(v)
62 }
63
64 fn alter_u32<S: Serializer>(ser: S, v: u32) -> Result<S::Ok, S::Error> {
66 ser.serialize_u32(v)
67 }
68
69 fn alter_u64<S: Serializer>(ser: S, v: u64) -> Result<S::Ok, S::Error> {
71 ser.serialize_u64(v)
72 }
73
74 fn alter_u128<S: Serializer>(ser: S, v: u128) -> Result<S::Ok, S::Error> {
76 ser.serialize_u128(v)
77 }
78
79 fn alter_f32<S: Serializer>(ser: S, v: f32) -> Result<S::Ok, S::Error> {
81 ser.serialize_f32(v)
82 }
83
84 fn alter_f64<S: Serializer>(ser: S, v: f64) -> Result<S::Ok, S::Error> {
86 ser.serialize_f64(v)
87 }
88
89 fn alter_char<S: Serializer>(ser: S, v: char) -> Result<S::Ok, S::Error> {
91 ser.serialize_char(v)
92 }
93
94 fn alter_str<S: Serializer>(ser: S, v: &str) -> Result<S::Ok, S::Error> {
96 ser.serialize_str(v)
97 }
98
99 fn alter_bytes<S: Serializer>(ser: S, v: &[u8]) -> Result<S::Ok, S::Error> {
101 ser.serialize_bytes(v)
102 }
103
104 fn alter_none<S: Serializer>(ser: S) -> Result<S::Ok, S::Error> {
106 ser.serialize_none()
107 }
108
109 fn alter_some<S: Serializer, T: ?Sized + Serialize>(ser: S, value: &T) -> Result<S::Ok, S::Error> {
111 ser.serialize_some(value)
112 }
113
114 fn alter_unit<S: Serializer>(ser: S) -> Result<S::Ok, S::Error> {
116 ser.serialize_unit()
117 }
118
119 fn alter_unit_struct<S: Serializer>(ser: S, name: &'static str) -> Result<S::Ok, S::Error> {
121 ser.serialize_unit_struct(name)
122 }
123
124 fn alter_unit_variant<S: Serializer>(ser: S, name: &'static str, variant_index: u32, variant: &'static str) -> Result<S::Ok, S::Error> {
126 ser.serialize_unit_variant(name, variant_index, variant)
127 }
128
129 fn alter_newtype_struct<S: Serializer, T: ?Sized + Serialize>(ser: S, name: &'static str, value: &T) -> Result<S::Ok, S::Error> {
131 ser.serialize_newtype_struct(name, value)
132 }
133
134 fn alter_newtype_variant<S: Serializer, T: ?Sized + Serialize>(ser: S, name: &'static str, variant_index: u32, variant: &'static str, value: &T) -> Result<S::Ok, S::Error> {
136 ser.serialize_newtype_variant(name, variant_index, variant, value)
137 }
138
139 #[cfg(feature = "std")]
141 fn collect_str<S: Serializer, T: ?Sized + Display>(ser: S, value: &T) -> Result<S::Ok, S::Error> {
142 Self::alter_str(ser, &value.to_string())
143 }
144
145 #[cfg(not(feature = "std"))]
147 fn collect_str<S: Serializer, T: ?Sized + Display>(ser: S, value: &T) -> Result<S::Ok, S::Error>;
148}
149
150pub trait AlterRest {
154 type AlterSeq<S: Serializer>: SerializeSeq<Ok = S::Ok, Error = S::Error>;
156
157 type AlterTuple<S: Serializer>: SerializeTuple<Ok = S::Ok, Error = S::Error>;
159
160 type AlterTupleStruct<S: Serializer>: SerializeTupleStruct<Ok = S::Ok, Error = S::Error>;
162
163 type AlterTupleVariant<S: Serializer>: SerializeTupleVariant<Ok = S::Ok, Error = S::Error>;
165
166 type AlterMap<S: Serializer>: SerializeMap<Ok = S::Ok, Error = S::Error>;
168
169 type AlterStruct<S: Serializer>: SerializeStruct<Ok = S::Ok, Error = S::Error>;
171
172 type AlterStructVariant<S: Serializer>: SerializeStructVariant<Ok = S::Ok, Error = S::Error>;
174
175 fn alter_seq<S: Serializer>(ser: S, len: Option<usize>) -> Result<Self::AlterSeq<S>, S::Error>;
177
178 fn alter_tuple<S: Serializer>(ser: S, len: usize) -> Result<Self::AlterTuple<S>, S::Error>;
180
181 fn alter_tuple_struct<S: Serializer>(ser: S, name: &'static str, len: usize) -> Result<Self::AlterTupleStruct<S>, S::Error>;
183
184 fn alter_tuple_variant<S: Serializer>(ser: S, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::AlterTupleVariant<S>, S::Error>;
186
187 fn alter_map<S: Serializer>(ser: S, len: Option<usize>) -> Result<Self::AlterMap<S>, S::Error>;
189
190 fn alter_struct<S: Serializer>(ser: S, name: &'static str, len: usize) -> Result<Self::AlterStruct<S>, S::Error>;
192
193 fn alter_struct_variant<S: Serializer>(ser: S, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::AlterStructVariant<S>, S::Error>;
195}
196
197pub trait DeferRest {}
199
200impl<T: DeferRest> AlterRest for T {
201 type AlterSeq<S: Serializer> = S::SerializeSeq;
202 type AlterTuple<S: Serializer> = S::SerializeTuple;
203 type AlterTupleStruct<S: Serializer> = S::SerializeTupleStruct;
204 type AlterTupleVariant<S: Serializer> = S::SerializeTupleVariant;
205 type AlterMap<S: Serializer> = S::SerializeMap;
206 type AlterStruct<S: Serializer> = S::SerializeStruct;
207 type AlterStructVariant<S: Serializer> = S::SerializeStructVariant;
208
209 fn alter_seq<S: Serializer>(ser: S, len: Option<usize>) -> Result<Self::AlterSeq<S>, S::Error> {
210 ser.serialize_seq(len)
211 }
212 fn alter_tuple<S: Serializer>(ser: S, len: usize) -> Result<Self::AlterTuple<S>, S::Error> {
213 ser.serialize_tuple(len)
214 }
215 fn alter_tuple_struct<S: Serializer>(ser: S, name: &'static str, len: usize) -> Result<Self::AlterTupleStruct<S>, S::Error> {
216 ser.serialize_tuple_struct(name, len)
217 }
218 fn alter_tuple_variant<S: Serializer>(ser: S, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::AlterTupleVariant<S>, S::Error> {
219 ser.serialize_tuple_variant(name, variant_index, variant, len)
220 }
221 fn alter_map<S: Serializer>(ser: S, len: Option<usize>) -> Result<Self::AlterMap<S>, S::Error> {
222 ser.serialize_map(len)
223 }
224 fn alter_struct<S: Serializer>(ser: S, name: &'static str, len: usize) -> Result<Self::AlterStruct<S>, S::Error> {
225 ser.serialize_struct(name, len)
226 }
227 fn alter_struct_variant<S: Serializer>(ser: S, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::AlterStructVariant<S>, S::Error> {
228 ser.serialize_struct_variant(name, variant_index, variant, len)
229 }
230}
231
232struct AlteredSer<S, Z: ?Sized>(S, Cell<u8>, PhantomData<Z>);
233
234impl<S, Z: ?Sized> AlteredSer<S, Z> {
235 fn new(ser: S) -> Self {
236 AlteredSer(ser, Cell::new(0), PhantomData::<Z>)
237 }
238}
239
240impl<S: Serializer, Z: ?Sized + Alter> Serializer for AlteredSer<S, Z> {
241 type Ok = S::Ok;
242 type Error = S::Error;
243 type SerializeSeq = AlteredSer<Z::AlterSeq<S>, Z>;
244 type SerializeTuple = AlteredSer<Z::AlterTuple<S>, Z>;
245 type SerializeTupleStruct = AlteredSer<Z::AlterTupleStruct<S>, Z>;
246 type SerializeTupleVariant = AlteredSer<Z::AlterTupleVariant<S>, Z>;
247 type SerializeMap = AlteredSer<Z::AlterMap<S>, Z>;
248 type SerializeStruct = AlteredSer<Z::AlterStruct<S>, Z>;
249 type SerializeStructVariant = AlteredSer<Z::AlterStructVariant<S>, Z>;
250
251 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
252 Z::alter_bool(self.0, v)
253 }
254 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
255 Z::alter_i8(self.0, v)
256 }
257 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
258 Z::alter_i16(self.0, v)
259 }
260 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
261 Z::alter_i32(self.0, v)
262 }
263 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
264 Z::alter_i64(self.0, v)
265 }
266 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
267 Z::alter_i128(self.0, v)
268 }
269 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
270 Z::alter_u8(self.0, v)
271 }
272 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
273 Z::alter_u16(self.0, v)
274 }
275 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
276 Z::alter_u32(self.0, v)
277 }
278 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
279 Z::alter_u64(self.0, v)
280 }
281 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
282 Z::alter_u128(self.0, v)
283 }
284 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
285 Z::alter_f32(self.0, v)
286 }
287 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
288 Z::alter_f64(self.0, v)
289 }
290 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
291 Z::alter_char(self.0, v)
292 }
293 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
294 Z::alter_str(self.0, v)
295 }
296 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
297 Z::alter_bytes(self.0, v)
298 }
299 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
300 Z::alter_none(self.0)
301 }
302 fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
303 Z::alter_some(self.0, &Altered::<_, Z>::new(value))
304 }
305 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
306 Z::alter_unit(self.0)
307 }
308 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
309 Z::alter_unit_struct(self.0, name)
310 }
311 fn serialize_unit_variant(self, name: &'static str, variant_index: u32, variant: &'static str) -> Result<Self::Ok, Self::Error> {
312 Z::alter_unit_variant(self.0, name, variant_index, variant)
313 }
314 fn serialize_newtype_struct<T: ?Sized + Serialize>(self, name: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
315 if name == UNALTER {
316 value.serialize(self.0)
317 } else {
318 Z::alter_newtype_struct(self.0, name, &Altered::<_, Z>::new(value))
319 }
320 }
321 fn serialize_newtype_variant<T: ?Sized + Serialize>(self, name: &'static str, variant_index: u32, variant: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
322 Z::alter_newtype_variant(self.0, name, variant_index, variant, &Altered::<_, Z>::new(value))
323 }
324 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
325 Z::alter_seq(self.0, len).map(AlteredSer::new)
326 }
327 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
328 Z::alter_tuple(self.0, len).map(AlteredSer::new)
329 }
330 fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> {
331 Z::alter_tuple_struct(self.0, name, len).map(AlteredSer::new)
332 }
333 fn serialize_tuple_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> {
334 Z::alter_tuple_variant(self.0, name, variant_index, variant, len).map(AlteredSer::new)
335 }
336 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
337 Z::alter_map(self.0, len).map(AlteredSer::new)
338 }
339 fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct, Self::Error> {
340 Z::alter_struct(self.0, name, len).map(AlteredSer::new)
341 }
342 fn serialize_struct_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant, Self::Error> {
343 Z::alter_struct_variant(self.0, name, variant_index, variant, len).map(AlteredSer::new)
344 }
345 fn collect_str<T: ?Sized + Display>(self, value: &T) -> Result<Self::Ok, Self::Error> {
346 Z::collect_str(self.0, value)
347 }
348 fn is_human_readable(&self) -> bool {
349 let i = self.1.get();
350 self.1.set((i + 1) % 3);
351 i == 2
352 }
353}
354
355impl<S: SerializeSeq, Z: ?Sized + Alter> SerializeSeq for AlteredSer<S, Z> {
356 type Ok = S::Ok;
357 type Error = S::Error;
358 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
359 self.0.serialize_element(&Altered::<_, Z>::new(value))
360 }
361 fn end(self) -> Result<Self::Ok, Self::Error> {
362 self.0.end()
363 }
364}
365
366impl<S: SerializeTuple, Z: ?Sized + Alter> SerializeTuple for AlteredSer<S, Z> {
367 type Ok = S::Ok;
368 type Error = S::Error;
369 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
370 self.0.serialize_element(&Altered::<_, Z>::new(value))
371 }
372 fn end(self) -> Result<Self::Ok, Self::Error> {
373 self.0.end()
374 }
375}
376
377impl<S: SerializeTupleStruct, Z: ?Sized + Alter> SerializeTupleStruct for AlteredSer<S, Z> {
378 type Ok = S::Ok;
379 type Error = S::Error;
380 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
381 self.0.serialize_field(&Altered::<_, Z>::new(value))
382 }
383 fn end(self) -> Result<Self::Ok, Self::Error> {
384 self.0.end()
385 }
386}
387
388impl<S: SerializeTupleVariant, Z: ?Sized + Alter> SerializeTupleVariant for AlteredSer<S, Z> {
389 type Ok = S::Ok;
390 type Error = S::Error;
391 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
392 self.0.serialize_field(&Altered::<_, Z>::new(value))
393 }
394 fn end(self) -> Result<Self::Ok, Self::Error> {
395 self.0.end()
396 }
397}
398
399impl<S: SerializeMap, Z: ?Sized + Alter> SerializeMap for AlteredSer<S, Z> {
400 type Ok = S::Ok;
401 type Error = S::Error;
402 fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<(), Self::Error> {
403 self.0.serialize_key(key)
404 }
405 fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
406 self.0.serialize_value(&Altered::<_, Z>::new(value))
407 }
408 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Self::Error>
409 where
410 K: ?Sized + Serialize,
411 V: ?Sized + Serialize,
412 {
413 self.0.serialize_entry(key, &Altered::<_, Z>::new(value))
414 }
415 fn end(self) -> Result<Self::Ok, Self::Error> {
416 self.0.end()
417 }
418}
419
420impl<S: SerializeStruct, Z: ?Sized + Alter> SerializeStruct for AlteredSer<S, Z> {
421 type Ok = S::Ok;
422 type Error = S::Error;
423 fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> {
424 self.0.serialize_field(key, &Altered::<_, Z>::new(value))
425 }
426 fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
427 self.0.skip_field(key)
428 }
429 fn end(self) -> Result<Self::Ok, Self::Error> {
430 self.0.end()
431 }
432}
433
434impl<S: SerializeStructVariant, Z: ?Sized + Alter> SerializeStructVariant for AlteredSer<S, Z> {
435 type Ok = S::Ok;
436 type Error = S::Error;
437 fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> {
438 self.0.serialize_field(key, &Altered::<_, Z>::new(value))
439 }
440 fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
441 self.0.skip_field(key)
442 }
443 fn end(self) -> Result<Self::Ok, Self::Error> {
444 self.0.end()
445 }
446}
447
448struct AltSer<S>(S, Cell<u8>);
449
450impl<S> AltSer<S> {
451 fn new(ser: S) -> Self {
452 AltSer(ser, Cell::new(0))
453 }
454}
455
456impl<S: Serializer> Serializer for AltSer<S> {
457 type Ok = S::Ok;
458 type Error = S::Error;
459 type SerializeSeq = AltSer<S::SerializeSeq>;
460 type SerializeTuple = AltSer<S::SerializeTuple>;
461 type SerializeTupleStruct = AltSer<S::SerializeTupleStruct>;
462 type SerializeTupleVariant = AltSer<S::SerializeTupleVariant>;
463 type SerializeMap = AltSer<S::SerializeMap>;
464 type SerializeStruct = AltSer<S::SerializeStruct>;
465 type SerializeStructVariant = AltSer<S::SerializeStructVariant>;
466
467 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
468 self.0.serialize_bool(v)
469 }
470 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
471 self.0.serialize_i8(v)
472 }
473 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
474 self.0.serialize_i16(v)
475 }
476 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
477 self.0.serialize_i32(v)
478 }
479 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
480 self.0.serialize_i64(v)
481 }
482 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
483 self.0.serialize_i128(v)
484 }
485 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
486 self.0.serialize_u8(v)
487 }
488 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
489 self.0.serialize_u16(v)
490 }
491 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
492 self.0.serialize_u32(v)
493 }
494 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
495 self.0.serialize_u64(v)
496 }
497 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
498 self.0.serialize_u128(v)
499 }
500 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
501 self.0.serialize_f32(v)
502 }
503 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
504 self.0.serialize_f64(v)
505 }
506 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
507 self.0.serialize_char(v)
508 }
509 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
510 self.0.serialize_str(v)
511 }
512 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
513 self.0.serialize_bytes(v)
514 }
515 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
516 self.0.serialize_none()
517 }
518 fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
519 self.0.serialize_some(&Alt::new(value))
520 }
521 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
522 self.0.serialize_unit()
523 }
524 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
525 self.0.serialize_unit_struct(name)
526 }
527 fn serialize_unit_variant(self, name: &'static str, variant_index: u32, variant: &'static str) -> Result<Self::Ok, Self::Error> {
528 self.0.serialize_unit_variant(name, variant_index, variant)
529 }
530 fn serialize_newtype_struct<T: ?Sized + Serialize>(self, name: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
531 self.0.serialize_newtype_struct(name, &Alt::new(value))
532 }
533 fn serialize_newtype_variant<T: ?Sized + Serialize>(self, name: &'static str, variant_index: u32, variant: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
534 self.0.serialize_newtype_variant(name, variant_index, variant, &Alt::new(value))
535 }
536 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
537 self.0.serialize_seq(len).map(AltSer::new)
538 }
539 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
540 self.0.serialize_tuple(len).map(AltSer::new)
541 }
542 fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> {
543 self.0.serialize_tuple_struct(name, len).map(AltSer::new)
544 }
545 fn serialize_tuple_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> {
546 self.0.serialize_tuple_variant(name, variant_index, variant, len).map(AltSer::new)
547 }
548 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
549 self.0.serialize_map(len).map(AltSer::new)
550 }
551 fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct, Self::Error> {
552 self.0.serialize_struct(name, len).map(AltSer::new)
553 }
554 fn serialize_struct_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant, Self::Error> {
555 self.0.serialize_struct_variant(name, variant_index, variant, len).map(AltSer::new)
556 }
557 fn collect_str<T: ?Sized + Display>(self, value: &T) -> Result<Self::Ok, Self::Error> {
558 self.0.collect_str(value)
559 }
560 fn is_human_readable(&self) -> bool {
561 let i = self.1.get();
562 self.1.set((i + 1) % 3);
563 i != 2
564 }
565}
566
567impl<S: SerializeSeq> SerializeSeq for AltSer<S> {
568 type Ok = S::Ok;
569 type Error = S::Error;
570 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
571 self.0.serialize_element(&Alt::new(value))
572 }
573 fn end(self) -> Result<Self::Ok, Self::Error> {
574 self.0.end()
575 }
576}
577
578impl<S: SerializeTuple> SerializeTuple for AltSer<S> {
579 type Ok = S::Ok;
580 type Error = S::Error;
581 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
582 self.0.serialize_element(&Alt::new(value))
583 }
584 fn end(self) -> Result<Self::Ok, Self::Error> {
585 self.0.end()
586 }
587}
588
589impl<S: SerializeTupleStruct> SerializeTupleStruct for AltSer<S> {
590 type Ok = S::Ok;
591 type Error = S::Error;
592 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
593 self.0.serialize_field(&Alt::new(value))
594 }
595 fn end(self) -> Result<Self::Ok, Self::Error> {
596 self.0.end()
597 }
598}
599
600impl<S: SerializeTupleVariant> SerializeTupleVariant for AltSer<S> {
601 type Ok = S::Ok;
602 type Error = S::Error;
603 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
604 self.0.serialize_field(&Alt::new(value))
605 }
606 fn end(self) -> Result<Self::Ok, Self::Error> {
607 self.0.end()
608 }
609}
610
611impl<S: SerializeMap> SerializeMap for AltSer<S> {
612 type Ok = S::Ok;
613 type Error = S::Error;
614 fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<(), Self::Error> {
615 self.0.serialize_key(key)
616 }
617 fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
618 self.0.serialize_value(&Alt::new(value))
619 }
620 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Self::Error>
621 where
622 K: ?Sized + Serialize,
623 V: ?Sized + Serialize,
624 {
625 self.0.serialize_entry(key, &Alt::new(value))
626 }
627 fn end(self) -> Result<Self::Ok, Self::Error> {
628 self.0.end()
629 }
630}
631
632impl<S: SerializeStruct> SerializeStruct for AltSer<S> {
633 type Ok = S::Ok;
634 type Error = S::Error;
635 fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> {
636 self.0.serialize_field(key, &Alt::new(value))
637 }
638 fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
639 self.0.skip_field(key)
640 }
641 fn end(self) -> Result<Self::Ok, Self::Error> {
642 self.0.end()
643 }
644}
645
646impl<S: SerializeStructVariant> SerializeStructVariant for AltSer<S> {
647 type Ok = S::Ok;
648 type Error = S::Error;
649 fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> {
650 self.0.serialize_field(key, &Alt::new(value))
651 }
652 fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
653 self.0.skip_field(key)
654 }
655 fn end(self) -> Result<Self::Ok, Self::Error> {
656 self.0.end()
657 }
658}
659
660#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
662pub struct Alt<T>(pub T);
663
664impl<T> Alt<T> {
665 pub fn new(value: T) -> Self {
666 Self(value)
667 }
668}
669
670impl<T> Deref for Alt<T> {
671 type Target = T;
672 fn deref(&self) -> &Self::Target {
673 &self.0
674 }
675}
676
677impl<T> DerefMut for Alt<T> {
678 fn deref_mut(&mut self) -> &mut Self::Target {
679 &mut self.0
680 }
681}
682
683impl<T> From<T> for Alt<T> {
684 fn from(value: T) -> Self {
685 Self::new(value)
686 }
687}
688
689impl<'de, T: Deserialize<'de>> Deserialize<'de> for Alt<T> {
690 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
691 T::deserialize(deserializer).map(Self::new)
692 }
693}
694
695impl<T: Serialize> Serialize for Alt<T> {
696 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
697 self.0.serialize(AltSer::new(serializer))
698 }
699}
700
701#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
709pub struct Altered<T, Z: ?Sized>(pub T, pub PhantomData<Z>);
710
711impl<T, Z: ?Sized> Altered<T, Z> {
712 pub fn new(value: T) -> Self {
713 Self(value, PhantomData)
714 }
715}
716
717impl<T, Z: ?Sized> Deref for Altered<T, Z> {
718 type Target = T;
719 fn deref(&self) -> &Self::Target {
720 &self.0
721 }
722}
723
724impl<T, Z: ?Sized> DerefMut for Altered<T, Z> {
725 fn deref_mut(&mut self) -> &mut Self::Target {
726 &mut self.0
727 }
728}
729
730impl<T, Z> From<T> for Altered<T, Z> {
731 fn from(value: T) -> Self {
732 Self::new(value)
733 }
734}
735
736impl<'de, T: Deserialize<'de>, Z: ?Sized> Deserialize<'de> for Altered<T, Z> {
737 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
738 T::deserialize(deserializer).map(Self::new)
739 }
740}
741
742impl<T: Serialize, Z: ?Sized + Alter> Serialize for Altered<T, Z> {
743 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
744 self.0.serialize(AlteredSer::<_, Z>::new(serializer))
745 }
746}
747
748#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
752pub struct Alternative<T, Z: ?Sized>(pub T, pub PhantomData<Z>);
753
754impl<T, Z: ?Sized> Alternative<T, Z> {
755 pub fn new(value: T) -> Self {
756 Self(value, PhantomData)
757 }
758}
759
760impl<T, Z: ?Sized> Deref for Alternative<T, Z> {
761 type Target = T;
762 fn deref(&self) -> &Self::Target {
763 &self.0
764 }
765}
766
767impl<T, Z: ?Sized> DerefMut for Alternative<T, Z> {
768 fn deref_mut(&mut self) -> &mut Self::Target {
769 &mut self.0
770 }
771}
772
773impl<T, Z> From<T> for Alternative<T, Z> {
774 fn from(value: T) -> Self {
775 Self::new(value)
776 }
777}
778
779impl<'de, T: Deserialize<'de>, Z: ?Sized> Deserialize<'de> for Alternative<T, Z> {
780 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
781 T::deserialize(deserializer).map(Self::new)
782 }
783}
784
785impl<T: Serialize, Z: ?Sized + Alter> Serialize for Alternative<T, Z> {
786 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
787 let a = serializer.is_human_readable();
788 let b = serializer.is_human_readable();
789 let c = serializer.is_human_readable();
790 if (c != b && a) || (a != b && c) {
791 self.0.serialize(AlteredSer::<_, Z>::new(serializer))
792 } else {
793 self.0.serialize(serializer)
794 }
795 }
796}
797
798#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
800pub struct Unaltered<T>(pub T);
801
802impl<T> Unaltered<T> {
803 pub fn new(value: T) -> Self {
804 Self(value)
805 }
806}
807
808impl<T> Deref for Unaltered<T> {
809 type Target = T;
810 fn deref(&self) -> &Self::Target {
811 &self.0
812 }
813}
814
815impl<T> DerefMut for Unaltered<T> {
816 fn deref_mut(&mut self) -> &mut Self::Target {
817 &mut self.0
818 }
819}
820
821impl<T> From<T> for Unaltered<T> {
822 fn from(value: T) -> Self {
823 Self::new(value)
824 }
825}
826
827impl<'de, T: Deserialize<'de>> Deserialize<'de> for Unaltered<T> {
828 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
829 T::deserialize(deserializer).map(Self::new)
830 }
831}
832
833impl<T: Serialize> Serialize for Unaltered<T> {
834 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
835 let a = serializer.is_human_readable();
836 let b = serializer.is_human_readable();
837 let c = serializer.is_human_readable();
838 if (c != b && !a) || (a != b && !c) {
839 serializer.serialize_newtype_struct(UNALTER, &self.0)
840 } else {
841 self.0.serialize(serializer)
842 }
843 }
844}
845
846pub fn alt<S: Serializer, T: ?Sized + Serialize>(val: &T, ser: S) -> Result<S::Ok, S::Error> {
852 Alt::new(val).serialize(ser)
853}
854
855pub fn unaltered<S: Serializer, T: ?Sized + Serialize>(val: &T, ser: S) -> Result<S::Ok, S::Error> {
861 Unaltered::new(val).serialize(ser)
862}
863
864const UNALTER: &str = "ƝcƇDˡËljЎґ*ٝêӆߒqЄ˸BɆ̓ =ؔa5͓ns͚e";