Coverage Report

Created: 2026-06-28 08:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/serde_buf-0.1.2/src/lib.rs
Line
Count
Source
1
/*!
2
Generic buffering for `serde`.
3
4
This library provides the [`Owned`] and [`Ref`] types as format-independent buffers for `serde`.
5
Buffers are guaranteed to serialize in exactly the same way as their original source.
6
7
# Getting an owned buffer
8
9
Any type that implements [`serde_core::Serialize`] can be buffered into an [`Owned`] buffer:
10
11
```
12
# use std::cell::RefCell;
13
use serde_buf::Owned;
14
15
# fn main() -> Result<(), serde_buf::Error> {
16
// Imagine we have some owned resource...
17
thread_local! {
18
    static SOME_THREAD_STATIC: RefCell<Option<Owned>> = RefCell::new(None);
19
}
20
21
// ...and some short-lived data
22
let short_lived: &'_ str = "A string";
23
24
// We can create an owned buffer from it...
25
let buffer = Owned::buffer(short_lived)?;
26
27
// ...and stash it in our owned resource
28
SOME_THREAD_STATIC.with(|ts| *ts.borrow_mut() = Some(buffer));
29
# Ok(())
30
# }
31
```
32
33
# Getting a borrowed buffer
34
35
Borrowed [`Ref`] buffers may have internally borrowed strings, which makes them incompatible
36
with [`serde_core::Serialize`]. You can construct a [`Ref`] manually from any underlying source:
37
38
```
39
use serde_buf::Ref;
40
41
// Imagine we have some borrowed datatype
42
struct MyData<'a> {
43
    id: u64,
44
    content: &'a str,
45
}
46
47
// We can buffer it into a partially owned buffer manually
48
fn buffer_my_data<'a>(data: &'_ MyData<'a>) -> Ref<'a> {
49
    Ref::record_struct("MyData", [
50
        ("id", Ref::u64(data.id)),
51
        ("content", Ref::str(data.content)),
52
    ])
53
}
54
```
55
56
# Serializing a buffer
57
58
Once you've got an [`Owned`] or [`Ref`] buffer, you can then later use their own [`serde_core::Serialize`]
59
implementations to encode in some format:
60
61
```
62
# use serde_core::Serialize;
63
# use serde_derive::Serialize;
64
# use serde_buf::Owned;
65
# fn main() -> Result<(), Box<dyn std::error::Error>> {
66
#[derive(Serialize)]
67
struct MyData<'a> {
68
    id: u64,
69
    content: &'a str,
70
}
71
72
let data = MyData {
73
    id: 42,
74
    content: "Some content",
75
};
76
77
let buffer = Owned::buffer(&data)?;
78
79
let data_json = serde_json::to_string(&data)?;
80
let buffer_json = serde_json::to_string(&buffer)?;
81
82
assert_eq!(data_json, buffer_json);
83
# Ok(())
84
# }
85
```
86
87
# Deserializing from a buffer
88
89
Values can also be deserialized directly from an [`Owned`] or [`Ref`] buffer through their [`serde_core::de::IntoDeserializer`]
90
implementations:
91
92
```
93
# fn main() -> Result<(), serde_buf::Error> {
94
# fn buffer_my_data<'a>(data: &'_ MyData<'a>) -> Ref<'a> {
95
#     Ref::record_struct("MyData", [
96
#         ("id", Ref::u64(data.id)),
97
#         ("content", Ref::str(data.content)),
98
#     ])
99
# }
100
# use serde_core::{Deserialize, de::IntoDeserializer};
101
# use serde_derive::Deserialize;
102
# use serde_buf::Ref;
103
#[derive(Deserialize, Debug, PartialEq)]
104
struct MyData<'a> {
105
    id: u64,
106
    content: &'a str,
107
}
108
109
let data = MyData {
110
    id: 42,
111
    content: "Some content",
112
};
113
114
let buffer: Ref = buffer_my_data(&data);
115
116
let deserialized = MyData::deserialize(buffer.into_deserializer())?;
117
118
assert_eq!(data, deserialized);
119
# Ok(())
120
# }
121
```
122
123
# Deserializing directly to a buffer
124
125
The [`Ref`] and [`Owned`] types don't implement [`serde_core::Deserialize`] and can't be deserialized directly.
126
This is because `serde` relies on hints from the target type to know how to interpret enum variants.
127
If a type implements both [`serde_core::Serialize`] and [`serde_core::Deserialize`] then you can first deserialize to
128
that concrete type, and then buffer it:
129
130
```
131
# use serde_core::Deserialize;
132
# use serde_buf::Owned;
133
# fn main() -> Result<(), Box<dyn std::error::Error>> {
134
# fn data_json() -> String { serde_json::to_string(&MyData::Full { id: 42, content: "Some content" }).unwrap() }
135
# use serde_derive::{Serialize, Deserialize};
136
#[derive(Serialize, Deserialize)]
137
enum MyData<'a> {
138
    Short(&'a str),
139
    Full { id: u64, content: &'a str },
140
}
141
142
let json = data_json();
143
144
let buffer = Owned::buffer(&serde_json::from_str::<MyData>(&json)?)?;
145
# Ok(())
146
# }
147
```
148
*/
149
150
#![deny(missing_docs)]
151
#![no_std]
152
153
extern crate alloc;
154
155
use core::{borrow::Borrow, fmt};
156
157
use alloc::{boxed::Box, string::String, vec::Vec};
158
use serde_core::Serialize;
159
160
mod de;
161
mod ser;
162
163
pub use self::{de::Deserializer, ser::Serializer};
164
165
/**
166
An error encountered while buffering a value.
167
*/
168
#[derive(Debug)]
169
pub struct Error(#[allow(dead_code)] String);
170
171
impl fmt::Display for Error {
172
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
173
0
        write!(f, "error buffering a value")
174
0
    }
175
}
176
177
impl serde_core::ser::StdError for Error {}
178
179
/**
180
A fully owned value.
181
*/
182
#[derive(Clone, Debug)]
183
#[cfg_attr(test, derive(PartialEq))]
184
pub struct Owned(Value<'static>);
185
186
impl From<Ref<'static>> for Owned {
187
0
    fn from(value: Ref<'static>) -> Self {
188
0
        Owned(value.0)
189
0
    }
190
}
191
192
impl Owned {
193
    /**
194
    Buffer `v` into an owned buffer.
195
196
    The resulting buffer is guaranteed to serialize to the same value as `v`.
197
    */
198
0
    pub fn buffer(v: impl Serialize) -> Result<Self, Error> {
199
0
        v.serialize(Serializer::new())
200
0
    }
Unexecuted instantiation: <serde_buf::Owned>::buffer::<&dyn erased_serde::ser::Serialize>
Unexecuted instantiation: <serde_buf::Owned>::buffer::<_>
201
}
202
203
/**
204
A partly owned value.
205
206
This buffer allows strings to be borrowed internally.
207
*/
208
#[derive(Clone, Debug)]
209
#[cfg_attr(test, derive(PartialEq))]
210
pub struct Ref<'a>(Value<'a>);
211
212
impl From<Owned> for Ref<'static> {
213
0
    fn from(value: Owned) -> Self {
214
0
        Ref(value.0)
215
0
    }
216
}
217
218
impl Ref<'static> {
219
    /**
220
    Buffer `v` into an owned buffer.
221
222
    The resulting buffer is guaranteed to serialize to the same value as `v`.
223
    */
224
0
    pub fn buffer(v: impl Serialize) -> Result<Self, Error> {
225
0
        Ok(v.serialize(Serializer::new())?.into())
226
0
    }
227
}
228
229
impl<'a> Ref<'a> {
230
    /**
231
    Create a buffer for a `()` value.
232
    */
233
0
    pub fn unit() -> Self {
234
0
        Ref(Value::Unit)
235
0
    }
236
237
    /**
238
    Create a buffer for a boolean value.
239
    */
240
0
    pub fn bool(v: bool) -> Self {
241
0
        Ref(Value::Bool(v))
242
0
    }
243
244
    /**
245
    Create a buffer for an unsigned integer value.
246
    */
247
0
    pub fn u8(v: u8) -> Self {
248
0
        Ref(Value::U8(v))
249
0
    }
250
251
    /**
252
    Create a buffer for an unsigned integer value.
253
    */
254
0
    pub fn u16(v: u16) -> Self {
255
0
        Ref(Value::U16(v))
256
0
    }
257
258
    /**
259
    Create a buffer for an unsigned integer value.
260
    */
261
0
    pub fn u32(v: u32) -> Self {
262
0
        Ref(Value::U32(v))
263
0
    }
264
265
    /**
266
    Create a buffer for an unsigned integer value.
267
    */
268
0
    pub fn u64(v: u64) -> Self {
269
0
        Ref(Value::U64(v))
270
0
    }
271
272
    /**
273
    Create a buffer for an unsigned integer value.
274
    */
275
0
    pub fn u128(v: u128) -> Self {
276
0
        Ref(Value::U128(v))
277
0
    }
278
279
    /**
280
    Create a buffer for a signed integer value.
281
    */
282
0
    pub fn i8(v: i8) -> Self {
283
0
        Ref(Value::I8(v))
284
0
    }
285
286
    /**
287
    Create a buffer for a signed integer value.
288
    */
289
0
    pub fn i16(v: i16) -> Self {
290
0
        Ref(Value::I16(v))
291
0
    }
292
293
    /**
294
    Create a buffer for a signed integer value.
295
    */
296
0
    pub fn i32(v: i32) -> Self {
297
0
        Ref(Value::I32(v))
298
0
    }
299
300
    /**
301
    Create a buffer for a signed integer value.
302
    */
303
0
    pub fn i64(v: i64) -> Self {
304
0
        Ref(Value::I64(v))
305
0
    }
306
307
    /**
308
    Create a buffer for a signed integer value.
309
    */
310
0
    pub fn i128(v: i128) -> Self {
311
0
        Ref(Value::I128(v))
312
0
    }
313
314
    /**
315
    Create a buffer for a binary floating point value.
316
    */
317
0
    pub fn f32(v: f32) -> Self {
318
0
        Ref(Value::F32(v))
319
0
    }
320
321
    /**
322
    Create a buffer for a binary floating point value.
323
    */
324
0
    pub fn f64(v: f64) -> Self {
325
0
        Ref(Value::F64(v))
326
0
    }
327
328
    /**
329
    Create a buffer for a single character value.
330
    */
331
0
    pub fn char(v: char) -> Self {
332
0
        Ref(Value::Char(v))
333
0
    }
334
335
    /**
336
    Create a buffer for an owned string value.
337
    */
338
0
    pub fn owned_str(v: impl Into<String>) -> Self {
339
0
        Ref(Value::Str(v.into().into_boxed_str()))
340
0
    }
341
342
    /**
343
    Create a buffer for a borrowed string value.
344
    */
345
0
    pub fn str(v: &'a (impl Borrow<str> + ?Sized)) -> Self {
346
0
        Ref(Value::BorrowedStr(v.borrow()))
347
0
    }
348
349
    /**
350
    Create a buffer for an owned byte-string value.
351
    */
352
0
    pub fn owned_bytes(v: impl Into<Vec<u8>>) -> Self {
353
0
        Ref(Value::Bytes(v.into().into_boxed_slice()))
354
0
    }
355
356
    /**
357
    Create a buffer for a borrowed byte-string value.
358
    */
359
0
    pub fn bytes(v: &'a (impl Borrow<[u8]> + ?Sized)) -> Self {
360
0
        Ref(Value::BorrowedBytes(v.borrow()))
361
0
    }
362
363
    /**
364
    Create a buffer for an `Option::None` value.
365
    */
366
0
    pub fn none() -> Self {
367
0
        Ref(Value::None)
368
0
    }
369
370
    /**
371
    Create a buffer for an `Option::Some` value.
372
    */
373
0
    pub fn some(v: impl Into<Ref<'a>>) -> Self {
374
0
        Ref(Value::Some(Box::new(v.into().0)))
375
0
    }
376
377
    /**
378
    Create a buffer for a unit struct, like `struct A`.
379
    */
380
0
    pub fn unit_struct(name: &'static str) -> Self {
381
0
        Ref(Value::UnitStruct { name })
382
0
    }
383
384
    /**
385
    Create a buffer for a newtype struct, like `struct A(T)`.
386
    */
387
0
    pub fn newtype_struct(name: &'static str, value: impl Into<Ref<'a>>) -> Self {
388
0
        Ref(Value::NewtypeStruct {
389
0
            name,
390
0
            value: Box::new(value.into().0),
391
0
        })
392
0
    }
393
394
    /**
395
    Create a buffer for a struct with named fields, like `struct A { a: T, b: U }`.
396
    */
397
0
    pub fn record_struct(
398
0
        name: &'static str,
399
0
        fields: impl IntoIterator<Item = (&'static str, Ref<'a>)>,
400
0
    ) -> Self {
401
        Ref(Value::Struct {
402
0
            name,
403
0
            fields: fields
404
0
                .into_iter()
405
0
                .map(|(k, v)| (k, v.0))
406
0
                .collect::<Vec<_>>()
407
0
                .into_boxed_slice(),
408
        })
409
0
    }
410
411
    /**
412
    Create a buffer for a struct with unnamed fields, like `struct A(T, U)`.
413
    */
414
0
    pub fn tuple_struct(name: &'static str, fields: impl IntoIterator<Item = Ref<'a>>) -> Self {
415
        Ref(Value::TupleStruct {
416
0
            name,
417
0
            fields: fields
418
0
                .into_iter()
419
0
                .map(|v| v.0)
420
0
                .collect::<Vec<_>>()
421
0
                .into_boxed_slice(),
422
        })
423
0
    }
424
425
    /**
426
    Create a buffer for a tuple, like `(T, U)`.
427
    */
428
0
    pub fn tuple(fields: impl IntoIterator<Item = Ref<'a>>) -> Self {
429
        Ref(Value::Tuple(
430
0
            fields
431
0
                .into_iter()
432
0
                .map(|v| v.0)
433
0
                .collect::<Vec<_>>()
434
0
                .into_boxed_slice(),
435
        ))
436
0
    }
437
438
    /**
439
    Create a buffer for a unit enum variant, like `A::B`.
440
    */
441
0
    pub fn unit_variant(name: &'static str, variant_index: u32, variant: &'static str) -> Self {
442
0
        Ref(Value::UnitVariant {
443
0
            name,
444
0
            variant_index,
445
0
            variant,
446
0
        })
447
0
    }
448
449
    /**
450
    Create a buffer for a newtype enum variant, like `A::B(T)`.
451
    */
452
0
    pub fn newtype_variant(
453
0
        name: &'static str,
454
0
        variant_index: u32,
455
0
        variant: &'static str,
456
0
        value: impl Into<Ref<'a>>,
457
0
    ) -> Self {
458
0
        Ref(Value::NewtypeVariant {
459
0
            name,
460
0
            variant_index,
461
0
            variant,
462
0
            value: Box::new(value.into().0),
463
0
        })
464
0
    }
465
466
    /**
467
    Create a buffer for an enum variant with unnamed fields, like `A::B(T, U)`.
468
    */
469
0
    pub fn tuple_variant(
470
0
        name: &'static str,
471
0
        variant_index: u32,
472
0
        variant: &'static str,
473
0
        fields: impl IntoIterator<Item = Ref<'a>>,
474
0
    ) -> Self {
475
        Ref(Value::TupleVariant {
476
0
            name,
477
0
            variant_index,
478
0
            variant,
479
0
            fields: fields
480
0
                .into_iter()
481
0
                .map(|v| v.0)
482
0
                .collect::<Vec<_>>()
483
0
                .into_boxed_slice(),
484
        })
485
0
    }
486
487
    /**
488
    Create a buffer for an enum variant with named fields, like `A::B { a: T, b: U }`.
489
    */
490
0
    pub fn record_struct_variant(
491
0
        name: &'static str,
492
0
        variant_index: u32,
493
0
        variant: &'static str,
494
0
        fields: impl IntoIterator<Item = (&'static str, Ref<'a>)>,
495
0
    ) -> Self {
496
        Ref(Value::StructVariant {
497
0
            name,
498
0
            variant_index,
499
0
            variant,
500
0
            fields: fields
501
0
                .into_iter()
502
0
                .map(|(k, v)| (k, v.0))
503
0
                .collect::<Vec<_>>()
504
0
                .into_boxed_slice(),
505
        })
506
0
    }
507
508
    /**
509
    Create a buffer for a sequence.
510
    */
511
0
    pub fn seq(fields: impl IntoIterator<Item = Ref<'a>>) -> Self {
512
        Ref(Value::Seq(
513
0
            fields
514
0
                .into_iter()
515
0
                .map(|v| v.0)
516
0
                .collect::<Vec<_>>()
517
0
                .into_boxed_slice(),
518
        ))
519
0
    }
520
521
    /**
522
    Create a buffer for a map.
523
    */
524
0
    pub fn map(fields: impl IntoIterator<Item = (Ref<'a>, Ref<'a>)>) -> Self {
525
        Ref(Value::Map(
526
0
            fields
527
0
                .into_iter()
528
0
                .map(|(k, v)| (k.0, v.0))
529
0
                .collect::<Vec<_>>()
530
0
                .into_boxed_slice(),
531
        ))
532
0
    }
533
}
534
535
#[derive(Clone, Debug, PartialEq)]
536
enum Value<'a> {
537
    Unit,
538
    U8(u8),
539
    U16(u16),
540
    U32(u32),
541
    U64(u64),
542
    U128(u128),
543
    I8(i8),
544
    I16(i16),
545
    I32(i32),
546
    I64(i64),
547
    I128(i128),
548
    F32(f32),
549
    F64(f64),
550
    Bool(bool),
551
    Char(char),
552
    Str(Box<str>),
553
    BorrowedStr(&'a str),
554
    Bytes(Box<[u8]>),
555
    BorrowedBytes(&'a [u8]),
556
    None,
557
    Some(Box<Value<'a>>),
558
    UnitStruct {
559
        name: &'static str,
560
    },
561
    NewtypeStruct {
562
        name: &'static str,
563
        value: Box<Value<'a>>,
564
    },
565
    Struct {
566
        name: &'static str,
567
        fields: Box<[(&'static str, Value<'a>)]>,
568
    },
569
    Tuple(Box<[Value<'a>]>),
570
    TupleStruct {
571
        name: &'static str,
572
        fields: Box<[Value<'a>]>,
573
    },
574
    UnitVariant {
575
        name: &'static str,
576
        variant_index: u32,
577
        variant: &'static str,
578
    },
579
    NewtypeVariant {
580
        name: &'static str,
581
        variant_index: u32,
582
        variant: &'static str,
583
        value: Box<Value<'a>>,
584
    },
585
    TupleVariant {
586
        name: &'static str,
587
        variant_index: u32,
588
        variant: &'static str,
589
        fields: Box<[Value<'a>]>,
590
    },
591
    StructVariant {
592
        name: &'static str,
593
        variant_index: u32,
594
        variant: &'static str,
595
        fields: Box<[(&'static str, Value<'a>)]>,
596
    },
597
    Seq(Box<[Value<'a>]>),
598
    Map(Box<[(Value<'a>, Value<'a>)]>),
599
}
600
601
#[cfg(test)]
602
mod tests {
603
    use core::marker::PhantomData;
604
605
    use alloc::borrow::{Cow, ToOwned};
606
    use serde_core::{
607
        de::{Deserializer, IntoDeserializer, Visitor},
608
        ser::SerializeMap,
609
        Deserialize, Serialize,
610
    };
611
    use serde_test::Token;
612
613
    use serde_derive::{Deserialize, Serialize};
614
615
    use super::*;
616
617
    #[test]
618
    fn consistency() {
619
        test_case(
620
            Input::new(()),
621
            Input::new(Ref::unit()),
622
            Tokens::new(&[Token::Unit]),
623
            None,
624
        );
625
626
        test_case(
627
            Input::new(true),
628
            Input::new(Ref::bool(true)),
629
            Tokens::new(&[Token::Bool(true)]),
630
            None,
631
        );
632
633
        test_case(
634
            Input::new('a'),
635
            Input::new(Ref::char('a')),
636
            Tokens::new(&[Token::Char('a')]),
637
            None,
638
        );
639
640
        test_case(
641
            Input::new(1u8),
642
            Input::new(Ref::u8(1)),
643
            Tokens::new(&[Token::U8(1)]),
644
            None,
645
        );
646
        test_case(
647
            Input::new(1u16),
648
            Input::new(Ref::u16(1)),
649
            Tokens::new(&[Token::U16(1)]),
650
            None,
651
        );
652
        test_case(
653
            Input::new(1u32),
654
            Input::new(Ref::u32(1)),
655
            Tokens::new(&[Token::U32(1)]),
656
            None,
657
        );
658
        test_case(
659
            Input::new(1u64),
660
            Input::new(Ref::u64(1)),
661
            Tokens::new(&[Token::U64(1)]),
662
            None,
663
        );
664
665
        test_case(
666
            Input::new(-1i8),
667
            Input::new(Ref::i8(-1)),
668
            Tokens::new(&[Token::I8(-1)]),
669
            None,
670
        );
671
        test_case(
672
            Input::new(-1i16),
673
            Input::new(Ref::i16(-1)),
674
            Tokens::new(&[Token::I16(-1)]),
675
            None,
676
        );
677
        test_case(
678
            Input::new(-1i32),
679
            Input::new(Ref::i32(-1)),
680
            Tokens::new(&[Token::I32(-1)]),
681
            None,
682
        );
683
        test_case(
684
            Input::new(-1i64),
685
            Input::new(Ref::i64(-1)),
686
            Tokens::new(&[Token::I64(-1)]),
687
            None,
688
        );
689
690
        i128_test_case(1u128, Ref::u128(1));
691
        i128_test_case(-1i128, Ref::i128(-1));
692
693
        test_case(
694
            Input::new(1f32),
695
            Input::new(Ref::f32(1.0)),
696
            Tokens::new(&[Token::F32(1.0)]),
697
            None,
698
        );
699
        test_case(
700
            Input::new(1f64),
701
            Input::new(Ref::f64(1.0)),
702
            Tokens::new(&[Token::F64(1.0)]),
703
            None,
704
        );
705
706
        test_case(
707
            Input::new(Str(Cow::Borrowed("a string"))),
708
            Input::new(Ref::str("a string")),
709
            Tokens::new(&[Token::BorrowedStr("a string")]),
710
            Tokens::new(&[Token::Str("a string")]),
711
        );
712
713
        test_case(
714
            Input::new(Str(Cow::Owned("a string".to_owned()))),
715
            Input::new(Ref::owned_str("a string")),
716
            Tokens::new(&[Token::Str("a string")]),
717
            None,
718
        );
719
720
        test_case(
721
            Input::new(Bytes(Cow::Borrowed(b"a string"))),
722
            Input::new(Ref::bytes(b"a string")),
723
            Tokens::new(&[Token::BorrowedBytes(b"a string")]),
724
            Tokens::new(&[Token::Bytes(b"a string")]),
725
        );
726
727
        test_case(
728
            Input::new(Bytes(Cow::Owned(b"a string".to_vec()))),
729
            Input::new(Ref::owned_bytes(b"a string" as &[u8])),
730
            Tokens::new(&[Token::Bytes(b"a string")]),
731
            None,
732
        );
733
734
        test_case(
735
            Input::new(None::<()>),
736
            Input::new(Ref::none()),
737
            Tokens::new(&[Token::None]),
738
            None,
739
        );
740
        test_case(
741
            Input::new(Some(())),
742
            Input::new(Ref::some(Ref::unit())),
743
            Tokens::new(&[Token::Some, Token::Unit]),
744
            None,
745
        );
746
747
        test_case(
748
            Input::new(UnitStruct),
749
            Input::new(Ref::unit_struct("UnitStruct")),
750
            Tokens::new(&[Token::UnitStruct { name: "UnitStruct" }]),
751
            None,
752
        );
753
754
        test_case(
755
            Input::new(Enum::UnitVariant),
756
            Input::new(Ref::unit_variant("Enum", 0, "UnitVariant")),
757
            Tokens::new(&[Token::UnitVariant {
758
                name: "Enum",
759
                variant: "UnitVariant",
760
            }]),
761
            None,
762
        );
763
764
        test_case(
765
            Input::new(Enum::NewtypeVariant(())),
766
            Input::new(Ref::newtype_variant(
767
                "Enum",
768
                1,
769
                "NewtypeVariant",
770
                Ref::unit(),
771
            )),
772
            Tokens::new(&[
773
                Token::NewtypeVariant {
774
                    name: "Enum",
775
                    variant: "NewtypeVariant",
776
                },
777
                Token::Unit,
778
            ]),
779
            None,
780
        );
781
782
        test_case(
783
            Input::new(Enum::TupleVariant((), ())),
784
            Input::new(Ref::tuple_variant(
785
                "Enum",
786
                2,
787
                "TupleVariant",
788
                alloc::vec![Ref::unit(), Ref::unit()],
789
            )),
790
            Tokens::new(&[
791
                Token::TupleVariant {
792
                    name: "Enum",
793
                    variant: "TupleVariant",
794
                    len: 2,
795
                },
796
                Token::Unit,
797
                Token::Unit,
798
                Token::TupleVariantEnd,
799
            ]),
800
            None,
801
        );
802
803
        test_case(
804
            Input::new(Enum::StructVariant { a: (), b: () }),
805
            Input::new(Ref::record_struct_variant(
806
                "Enum",
807
                3,
808
                "StructVariant",
809
                alloc::vec![("a", Ref::unit()), ("b", Ref::unit())],
810
            )),
811
            Tokens::new(&[
812
                Token::StructVariant {
813
                    name: "Enum",
814
                    variant: "StructVariant",
815
                    len: 2,
816
                },
817
                Token::Str("a"),
818
                Token::Unit,
819
                Token::Str("b"),
820
                Token::Unit,
821
                Token::StructVariantEnd,
822
            ]),
823
            None,
824
        );
825
826
        test_case(
827
            Input::new(((), ())),
828
            Input::new(Ref::tuple(alloc::vec![Ref::unit(), Ref::unit()])),
829
            Tokens::new(&[
830
                Token::Tuple { len: 2 },
831
                Token::Unit,
832
                Token::Unit,
833
                Token::TupleEnd,
834
            ]),
835
            None,
836
        );
837
838
        test_case(
839
            Input::new(TupleStruct((), ())),
840
            Input::new(Ref::tuple_struct(
841
                "TupleStruct",
842
                alloc::vec![Ref::unit(), Ref::unit()],
843
            )),
844
            Tokens::new(&[
845
                Token::TupleStruct {
846
                    name: "TupleStruct",
847
                    len: 2,
848
                },
849
                Token::Unit,
850
                Token::Unit,
851
                Token::TupleStructEnd,
852
            ]),
853
            None,
854
        );
855
856
        test_case(
857
            Input::new(Struct { a: (), b: () }),
858
            Input::new(Ref::record_struct(
859
                "Struct",
860
                alloc::vec![("a", Ref::unit()), ("b", Ref::unit())],
861
            )),
862
            Tokens::new(&[
863
                Token::Struct {
864
                    name: "Struct",
865
                    len: 2,
866
                },
867
                Token::Str("a"),
868
                Token::Unit,
869
                Token::Str("b"),
870
                Token::Unit,
871
                Token::StructEnd,
872
            ]),
873
            None,
874
        );
875
876
        test_case(
877
            Input::new(NewtypeStruct(())),
878
            Input::new(Ref::newtype_struct("NewtypeStruct", Ref::unit())),
879
            Tokens::new(&[
880
                Token::NewtypeStruct {
881
                    name: "NewtypeStruct",
882
                },
883
                Token::Unit,
884
            ]),
885
            None,
886
        );
887
888
        test_case(
889
            Input::new(alloc::vec![(), ()]),
890
            Input::new(Ref::seq(alloc::vec![Ref::unit(), Ref::unit()])),
891
            Tokens::new(&[
892
                Token::Seq { len: Some(2) },
893
                Token::Unit,
894
                Token::Unit,
895
                Token::SeqEnd,
896
            ]),
897
            None,
898
        );
899
900
        test_case(
901
            Input::new(Map(alloc::vec![
902
                (Str(Cow::Borrowed("a")), ()),
903
                (Str(Cow::Borrowed("b")), ())
904
            ])),
905
            Input::new(Ref::map(alloc::vec![
906
                (Ref::str("a"), Ref::unit()),
907
                (Ref::str("b"), Ref::unit())
908
            ])),
909
            Tokens::new(&[
910
                Token::Map { len: Some(2) },
911
                Token::Str("a"),
912
                Token::Unit,
913
                Token::Str("b"),
914
                Token::Unit,
915
                Token::MapEnd,
916
            ]),
917
            None,
918
        );
919
    }
920
921
    #[derive(Debug, Clone, Copy, PartialEq)]
922
    struct Input<S> {
923
        value: S,
924
    }
925
926
    type Tokens<'de> = Input<&'de [Token]>;
927
928
    impl<S> Input<S> {
929
        fn new(value: S) -> Self {
930
            Input { value }
931
        }
932
    }
933
934
    fn test_case<'de, S: Serialize + Deserialize<'de> + PartialEq + fmt::Debug + Clone>(
935
        t: Input<S>,
936
        ref_buf: Input<Ref<'de>>,
937
        ref_tokens: Tokens<'de>,
938
        owned_tokens: impl Into<Option<Tokens<'de>>>,
939
    ) {
940
        let owned_tokens: Tokens<'de> = owned_tokens.into().unwrap_or(ref_tokens);
941
942
        serde_test::assert_ser_tokens(&t.value, ref_tokens.value);
943
944
        // T::Serialize -> Owned
945
        let t_to_owned = Input {
946
            value: t.value.serialize(Serializer::new()).unwrap(),
947
        };
948
949
        serde_test::assert_ser_tokens(&ref_buf.value, ref_tokens.value);
950
        serde_test::assert_ser_tokens(&t_to_owned.value, owned_tokens.value);
951
952
        // {Ref, Owned}::IntoDeserializer -> T
953
        let ref_to_t = Input {
954
            value: S::deserialize(ref_buf.value.into_deserializer()).unwrap(),
955
        };
956
        let owned_to_t = Input {
957
            value: S::deserialize(t_to_owned.value.into_deserializer()).unwrap(),
958
        };
959
960
        assert_eq!(t, ref_to_t);
961
        assert_eq!(t, owned_to_t);
962
    }
963
964
    fn i128_test_case<'de, T: Serialize + Deserialize<'de> + PartialEq + fmt::Debug>(
965
        v: T,
966
        ref_buf: Ref<'de>,
967
    ) {
968
        let t_to_owned = v.serialize(Serializer::new()).unwrap();
969
970
        assert_eq!(ref_buf.0, t_to_owned.0);
971
972
        let owned_to_t = T::deserialize(t_to_owned.into_deserializer()).unwrap();
973
974
        assert_eq!(v, owned_to_t);
975
    }
976
977
    #[derive(Debug, PartialEq, Clone)]
978
    struct Str<'a>(Cow<'a, str>);
979
980
    impl<'a> Serialize for Str<'a> {
981
        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
982
        where
983
            S: serde_core::Serializer,
984
        {
985
            serializer.serialize_str(&self.0)
986
        }
987
    }
988
989
    impl<'de> Deserialize<'de> for Str<'de> {
990
        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
991
        where
992
            D: serde_core::Deserializer<'de>,
993
        {
994
            let v = deserializer.deserialize_str(StrVisitor(PhantomData))?;
995
996
            Ok(Str(v))
997
        }
998
    }
999
1000
    struct StrVisitor<'de>(PhantomData<Cow<'de, str>>);
1001
1002
    impl<'de> Visitor<'de> for StrVisitor<'de> {
1003
        type Value = Cow<'de, str>;
1004
1005
        fn expecting(&self, formatter: &mut alloc::fmt::Formatter) -> alloc::fmt::Result {
1006
            write!(formatter, "a string")
1007
        }
1008
1009
        fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
1010
        where
1011
            E: serde_core::de::Error,
1012
        {
1013
            Ok(Cow::Owned(v.to_owned()))
1014
        }
1015
1016
        fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
1017
        where
1018
            E: serde_core::de::Error,
1019
        {
1020
            Ok(Cow::Owned(v))
1021
        }
1022
1023
        fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
1024
        where
1025
            E: serde_core::de::Error,
1026
        {
1027
            Ok(Cow::Borrowed(v))
1028
        }
1029
    }
1030
1031
    #[derive(Debug, PartialEq, Clone)]
1032
    struct Bytes<'a>(Cow<'a, [u8]>);
1033
1034
    impl<'a> Serialize for Bytes<'a> {
1035
        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1036
        where
1037
            S: serde_core::Serializer,
1038
        {
1039
            serializer.serialize_bytes(&self.0)
1040
        }
1041
    }
1042
1043
    impl<'de> Deserialize<'de> for Bytes<'de> {
1044
        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1045
        where
1046
            D: serde_core::Deserializer<'de>,
1047
        {
1048
            let v = deserializer.deserialize_bytes(BytesVisitor(PhantomData))?;
1049
1050
            Ok(Bytes(v))
1051
        }
1052
    }
1053
    struct BytesVisitor<'de>(PhantomData<Cow<'de, [u8]>>);
1054
1055
    impl<'de> Visitor<'de> for BytesVisitor<'de> {
1056
        type Value = Cow<'de, [u8]>;
1057
1058
        fn expecting(&self, formatter: &mut alloc::fmt::Formatter) -> alloc::fmt::Result {
1059
            write!(formatter, "a byte string")
1060
        }
1061
1062
        fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
1063
        where
1064
            E: serde_core::de::Error,
1065
        {
1066
            Ok(Cow::Owned(v.to_owned()))
1067
        }
1068
1069
        fn visit_byte_buf<E>(self, v: alloc::vec::Vec<u8>) -> Result<Self::Value, E>
1070
        where
1071
            E: serde_core::de::Error,
1072
        {
1073
            Ok(Cow::Owned(v))
1074
        }
1075
1076
        fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
1077
        where
1078
            E: serde_core::de::Error,
1079
        {
1080
            Ok(Cow::Borrowed(v))
1081
        }
1082
    }
1083
1084
    #[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
1085
    struct UnitStruct;
1086
1087
    #[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
1088
    struct TupleStruct((), ());
1089
1090
    #[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
1091
    struct Struct {
1092
        a: (),
1093
        b: (),
1094
    }
1095
1096
    #[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
1097
    struct NewtypeStruct(());
1098
1099
    #[derive(Serialize, Deserialize, PartialEq, Clone, Debug)]
1100
    enum Enum {
1101
        UnitVariant,
1102
        NewtypeVariant(()),
1103
        TupleVariant((), ()),
1104
        StructVariant { a: (), b: () },
1105
    }
1106
1107
    #[derive(PartialEq, Clone, Debug)]
1108
    struct Map<'a>(Vec<(Str<'a>, ())>);
1109
1110
    impl<'a> Serialize for Map<'a> {
1111
        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1112
        where
1113
            S: serde_core::Serializer,
1114
        {
1115
            let mut serializer = serializer.serialize_map(Some(self.0.len()))?;
1116
1117
            for (k, v) in &*self.0 {
1118
                serializer.serialize_key(k)?;
1119
                serializer.serialize_value(v)?;
1120
            }
1121
1122
            serializer.end()
1123
        }
1124
    }
1125
1126
    impl<'de> Deserialize<'de> for Map<'de> {
1127
        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1128
        where
1129
            D: Deserializer<'de>,
1130
        {
1131
            deserializer.deserialize_map(MapVisitor(PhantomData))
1132
        }
1133
    }
1134
1135
    struct MapVisitor<'de>(PhantomData<Map<'de>>);
1136
1137
    impl<'de> Visitor<'de> for MapVisitor<'de> {
1138
        type Value = Map<'de>;
1139
1140
        fn expecting(&self, formatter: &mut alloc::fmt::Formatter) -> alloc::fmt::Result {
1141
            write!(formatter, "a map")
1142
        }
1143
1144
        fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
1145
        where
1146
            A: serde_core::de::MapAccess<'de>,
1147
        {
1148
            let mut de = Vec::new();
1149
1150
            while let Some(k) = map.next_key()? {
1151
                let v = map.next_value()?;
1152
1153
                de.push((k, v));
1154
            }
1155
1156
            Ok(Map(de))
1157
        }
1158
    }
1159
}