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