1 use crate::{ByteArray, Bytes}; 2 use serde::Serializer; 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 serialized via `#[serde(with = "serde_bytes")]`. 19 pub trait Serialize { 20 #[allow(missing_docs)] serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer21 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 22 where 23 S: Serializer; 24 } 25 26 impl Serialize for [u8] { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,27 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 28 where 29 S: Serializer, 30 { 31 serializer.serialize_bytes(self) 32 } 33 } 34 35 #[cfg(any(feature = "std", feature = "alloc"))] 36 impl Serialize for Vec<u8> { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,37 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 38 where 39 S: Serializer, 40 { 41 serializer.serialize_bytes(self) 42 } 43 } 44 45 impl Serialize for Bytes { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,46 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 47 where 48 S: Serializer, 49 { 50 serializer.serialize_bytes(self) 51 } 52 } 53 54 impl<const N: usize> Serialize for [u8; N] { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,55 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 56 where 57 S: Serializer, 58 { 59 serializer.serialize_bytes(self) 60 } 61 } 62 63 impl<const N: usize> Serialize for ByteArray<N> { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,64 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 65 where 66 S: Serializer, 67 { 68 serializer.serialize_bytes(&**self) 69 } 70 } 71 72 #[cfg(any(feature = "std", feature = "alloc"))] 73 impl Serialize for ByteBuf { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,74 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 75 where 76 S: Serializer, 77 { 78 serializer.serialize_bytes(self) 79 } 80 } 81 82 #[cfg(any(feature = "std", feature = "alloc"))] 83 impl<'a> Serialize for Cow<'a, [u8]> { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,84 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 85 where 86 S: Serializer, 87 { 88 serializer.serialize_bytes(self) 89 } 90 } 91 92 #[cfg(any(feature = "std", feature = "alloc"))] 93 impl<'a> Serialize for Cow<'a, Bytes> { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,94 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 95 where 96 S: Serializer, 97 { 98 serializer.serialize_bytes(self) 99 } 100 } 101 102 impl<T> Serialize for &T 103 where 104 T: ?Sized + Serialize, 105 { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,106 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 107 where 108 S: Serializer, 109 { 110 (**self).serialize(serializer) 111 } 112 } 113 114 #[cfg(any(feature = "std", feature = "alloc"))] 115 impl<T> Serialize for Box<T> 116 where 117 T: ?Sized + Serialize, 118 { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,119 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 120 where 121 S: Serializer, 122 { 123 (**self).serialize(serializer) 124 } 125 } 126 127 impl<T> Serialize for Option<T> 128 where 129 T: Serialize, 130 { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,131 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 132 where 133 S: Serializer, 134 { 135 struct AsBytes<T>(T); 136 137 impl<T> serde::Serialize for AsBytes<T> 138 where 139 T: Serialize, 140 { 141 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 142 where 143 S: Serializer, 144 { 145 self.0.serialize(serializer) 146 } 147 } 148 149 match self { 150 Some(b) => serializer.serialize_some(&AsBytes(b)), 151 None => serializer.serialize_none(), 152 } 153 } 154 } 155