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
18pub 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 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 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}