/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 | | } |