bolt_proto/
serialization.rs

1use std::panic::UnwindSafe;
2
3use bytes::{Buf, Bytes};
4
5use crate::{
6    error::{DeserializationError, DeserializeResult, SerializeResult},
7    value::{MARKER_MEDIUM_STRUCT, MARKER_SMALL_STRUCT, MARKER_TINY_STRUCT},
8};
9
10pub(crate) trait BoltValue: Sized {
11    fn marker(&self) -> SerializeResult<u8>;
12
13    fn serialize(self) -> SerializeResult<Bytes>;
14
15    fn deserialize<B: Buf + UnwindSafe>(bytes: B) -> DeserializeResult<(Self, B)>;
16}
17
18pub(crate) trait BoltStructure: BoltValue {
19    fn signature(&self) -> u8;
20}
21
22/// Returns size and signature. Might panic - use this inside a catch_unwind block
23pub(crate) fn get_structure_info(
24    marker: u8,
25    bytes: &mut impl Buf,
26) -> DeserializeResult<(usize, u8)> {
27    let size = match marker {
28        marker if (MARKER_TINY_STRUCT..=(MARKER_TINY_STRUCT | 0x0F)).contains(&marker) => {
29            0x0F & marker as usize
30        }
31        MARKER_SMALL_STRUCT => bytes.get_u8() as usize,
32        MARKER_MEDIUM_STRUCT => bytes.get_u16() as usize,
33        _ => return Err(DeserializationError::InvalidMarkerByte(marker)),
34    };
35    let signature = bytes.get_u8();
36    Ok((size, signature))
37}