essential_types/serde/
bytecode.rs

1//! Custom bytecode serialization implementation for better human-friendly format support.
2
3use serde::{ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer};
4
5/// A type providing custom serialization implementations for a slice of bytecode.
6struct Bytecode<T>(T);
7
8impl Serialize for Bytecode<&[u8]> {
9    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
10    where
11        S: Serializer,
12    {
13        serialize(self.0, s)
14    }
15}
16
17impl<'de> Deserialize<'de> for Bytecode<Vec<u8>> {
18    fn deserialize<D>(d: D) -> Result<Self, D::Error>
19    where
20        D: Deserializer<'de>,
21    {
22        Ok(Self(deserialize(d)?))
23    }
24}
25
26/// Serialize a slice of bytecode.
27pub fn serialize<S>(bytecode: &[u8], s: S) -> Result<S::Ok, S::Error>
28where
29    S: Serializer,
30{
31    if s.is_human_readable() {
32        hex::serialize(bytecode, s)
33    } else {
34        bytecode.serialize(s)
35    }
36}
37
38/// Deserialize a slice of bytecode.
39pub fn deserialize<'de, D>(d: D) -> Result<Vec<u8>, D::Error>
40where
41    D: Deserializer<'de>,
42{
43    if d.is_human_readable() {
44        hex::deserialize(d)
45    } else {
46        Vec::deserialize(d)
47    }
48}
49
50/// Serialize a slice of bytecode slices.
51pub fn serialize_vec<S, T>(bytecode_slices: &[T], s: S) -> Result<S::Ok, S::Error>
52where
53    S: Serializer,
54    T: AsRef<[u8]> + Serialize,
55{
56    if s.is_human_readable() {
57        let mut seq = s.serialize_seq(Some(bytecode_slices.len()))?;
58        for slice in bytecode_slices {
59            seq.serialize_element(&Bytecode(slice.as_ref()))?;
60        }
61        seq.end()
62    } else {
63        bytecode_slices.serialize(s)
64    }
65}
66
67/// Deserialize a Vec of bytecode slices.
68pub fn deserialize_vec<'de, D>(d: D) -> Result<Vec<Vec<u8>>, D::Error>
69where
70    D: Deserializer<'de>,
71{
72    let slices: Vec<Bytecode<Vec<u8>>> = <_>::deserialize(d)?;
73    Ok(slices.into_iter().map(|bc| bc.0).collect())
74}