bolt_proto/
serialization.rs1use 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
22pub(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}