1use crate::{
2 decode::Decode,
3 encode::Encode,
4 into_type::IntoType,
5};
6use std::borrow::Cow;
7
8pub struct Bytes<'a>(pub &'a [u8]);
10
11impl<'a> Encode for Bytes<'a> {
12 fn encode(&self) -> Vec<u8> {
13 let len = self.required_len();
14 let mut buf = vec![0u8; len as usize];
15 buf[24..32].copy_from_slice(&(self.0.len() as u64).to_be_bytes());
16 buf[32..32 + self.0.len()].copy_from_slice(&self.0);
17 buf
18 }
19
20 fn required_len(&self) -> u64 {
21 (if self.0.len() / 32 == 0 {
22 32 + 32
23 } else {
24 (self.0.len() / 32 + 1) * 32 + 32
25 }) as u64
26 }
27
28 fn is_dynamic() -> bool {
29 true
30 }
31}
32
33impl<'a> Decode<'a> for Bytes<'a> {
34 fn decode(buf: &'a [u8]) -> Bytes<'a> {
35 let len = u64::decode(&buf[0..32]);
36 Bytes(&buf[32..32 + len as usize])
37 }
38}
39
40impl<'a> IntoType for Bytes<'a> {
41 fn into_type() -> Cow<'static, str> {
42 Cow::Borrowed("bytes")
43 }
44}
45
46#[cfg(feature = "derive")]
47impl<'a> serde::ser::Serialize for Bytes<'a> {
48 fn serialize<S: serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
49 serializer.serialize_bytes(&self.0)
50 }
51}
52
53#[cfg(feature = "derive")]
54impl<'a, 'de: 'a> serde::de::Deserialize<'de> for Bytes<'a> {
55 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
56 where
57 D: serde::de::Deserializer<'de>,
58 {
59 deserializer.deserialize_bytes(BytesVisitor)
60 }
61}
62
63struct BytesVisitor;
64
65#[cfg(feature = "derive")]
66impl<'de> serde::de::Visitor<'de> for BytesVisitor {
67 type Value = Bytes<'de>;
68
69 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
70 formatter.write_str("bytes array")
71 }
72
73 fn visit_borrowed_bytes<E: serde::de::Error>(self, value: &'de [u8]) -> Result<Self::Value, E> {
74 Ok(Bytes(value))
75 }
76}