solid_core/
bytes.rs

1use crate::{
2    decode::Decode,
3    encode::Encode,
4    into_type::IntoType,
5};
6use std::borrow::Cow;
7
8/// Solidity Type `bytes`
9pub 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}