1 use crate::Bytes;
2 use serde::Deserializer;
3 
4 #[cfg(any(feature = "std", feature = "alloc"))]
5 use crate::ByteBuf;
6 
7 #[cfg(feature = "alloc")]
8 use alloc::borrow::Cow;
9 #[cfg(all(feature = "std", not(feature = "alloc")))]
10 use std::borrow::Cow;
11 
12 #[cfg(feature = "alloc")]
13 use alloc::boxed::Box;
14 
15 #[cfg(feature = "alloc")]
16 use alloc::vec::Vec;
17 
18 /// Types that can be deserialized via `#[serde(with = "serde_bytes")]`.
19 pub trait Deserialize<'de>: Sized {
20     #[allow(missing_docs)]
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>21     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
22     where
23         D: Deserializer<'de>;
24 }
25 
26 impl<'de: 'a, 'a> Deserialize<'de> for &'a [u8] {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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"))]
37 impl<'de> Deserialize<'de> for Vec<u8> {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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 
46 impl<'de: 'a, 'a> Deserialize<'de> for &'a Bytes {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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"))]
56 impl<'de> Deserialize<'de> for ByteBuf {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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"))]
67 impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, [u8]> {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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"))]
77 impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, Bytes> {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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"))]
87 impl<'de> Deserialize<'de> for Box<[u8]> {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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"))]
97 impl<'de> Deserialize<'de> for Box<Bytes> {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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 }
106