proof_of_sql/base/
standard_binary_serde.rs

1use alloc::vec::Vec;
2use bincode::{
3    config::Config,
4    error::{DecodeError, EncodeError},
5};
6use serde::{Deserialize, Serialize};
7
8fn standard_binary_config() -> impl Config {
9    bincode::config::legacy()
10        .with_fixed_int_encoding()
11        .with_big_endian()
12}
13
14/// The standard serialization we use for our proof types
15pub fn try_standard_binary_serialization(
16    value_to_be_serialized: impl Serialize,
17) -> Result<Vec<u8>, EncodeError> {
18    bincode::serde::encode_to_vec(value_to_be_serialized, standard_binary_config())
19}
20
21/// The standard deserialization we use for our proof types
22pub fn try_standard_binary_deserialization<D: for<'a> Deserialize<'a>>(
23    value_to_be_deserialized: &[u8],
24) -> Result<(D, usize), DecodeError> {
25    bincode::serde::decode_from_slice(value_to_be_deserialized, standard_binary_config())
26}
27
28#[cfg(test)]
29mod tests {
30    use super::{try_standard_binary_deserialization, try_standard_binary_serialization};
31    use serde::{Deserialize, Serialize};
32
33    #[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)]
34    struct SerdeTestType {
35        a: String,
36        b: bool,
37        c: i32,
38    }
39
40    #[test]
41    fn round_trip() {
42        let obj = SerdeTestType {
43            a: "test".to_string(),
44            b: false,
45            c: 123,
46        };
47        let serialized = try_standard_binary_serialization(obj.clone()).unwrap();
48        let (deserialized, _): (SerdeTestType, _) =
49            try_standard_binary_deserialization(&serialized).unwrap();
50        assert_eq!(obj, deserialized);
51        let reserialized = try_standard_binary_serialization(deserialized).unwrap();
52        assert_eq!(serialized, reserialized);
53    }
54}