serde_bytes/
de.rs

1use crate::Bytes;
2use serde::Deserializer;
3
4#[cfg(any(feature = "std", feature = "alloc"))]
5use crate::ByteBuf;
6
7#[cfg(feature = "alloc")]
8use alloc::borrow::Cow;
9#[cfg(all(feature = "std", not(feature = "alloc")))]
10use std::borrow::Cow;
11
12#[cfg(feature = "alloc")]
13use alloc::boxed::Box;
14
15#[cfg(feature = "alloc")]
16use alloc::vec::Vec;
17
18/// Types that can be deserialized via `#[serde(with = "serde_bytes")]`.
19pub trait Deserialize<'de>: Sized {
20    #[allow(missing_docs)]
21    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
22    where
23        D: Deserializer<'de>;
24}
25
26impl<'de: 'a, 'a> Deserialize<'de> for &'a [u8] {
27    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
28    where
29        D: Deserializer<'de>,
30    {
31        // Via the serde::Deserialize impl for &[u8].
32        serde::Deserialize::deserialize(deserializer)
33    }
34}
35
36#[cfg(any(feature = "std", feature = "alloc"))]
37impl<'de> Deserialize<'de> for Vec<u8> {
38    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
39    where
40        D: Deserializer<'de>,
41    {
42        Deserialize::deserialize(deserializer).map(ByteBuf::into_vec)
43    }
44}
45
46impl<'de: 'a, 'a> Deserialize<'de> for &'a Bytes {
47    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
48    where
49        D: Deserializer<'de>,
50    {
51        Deserialize::deserialize(deserializer).map(Bytes::new)
52    }
53}
54
55#[cfg(any(feature = "std", feature = "alloc"))]
56impl<'de> Deserialize<'de> for ByteBuf {
57    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
58    where
59        D: Deserializer<'de>,
60    {
61        // Via the serde::Deserialize impl for ByteBuf.
62        serde::Deserialize::deserialize(deserializer)
63    }
64}
65
66#[cfg(any(feature = "std", feature = "alloc"))]
67impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, [u8]> {
68    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
69    where
70        D: Deserializer<'de>,
71    {
72        Deserialize::deserialize(deserializer).map(Cow::Borrowed)
73    }
74}
75
76#[cfg(any(feature = "std", feature = "alloc"))]
77impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, Bytes> {
78    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
79    where
80        D: Deserializer<'de>,
81    {
82        Deserialize::deserialize(deserializer).map(Cow::Borrowed)
83    }
84}
85
86#[cfg(any(feature = "std", feature = "alloc"))]
87impl<'de> Deserialize<'de> for Box<[u8]> {
88    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
89    where
90        D: Deserializer<'de>,
91    {
92        Deserialize::deserialize(deserializer).map(Vec::into_boxed_slice)
93    }
94}
95
96#[cfg(any(feature = "std", feature = "alloc"))]
97impl<'de> Deserialize<'de> for Box<Bytes> {
98    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
99    where
100        D: Deserializer<'de>,
101    {
102        let bytes: Box<[u8]> = Deserialize::deserialize(deserializer)?;
103        Ok(bytes.into())
104    }
105}