massa_consensus_exports/
bootstrapable_graph.rs1use crate::export_active_block::{
2 ExportActiveBlock, ExportActiveBlockDeserializer, ExportActiveBlockSerializer,
3};
4use massa_models::block::BlockDeserializerArgs;
5use massa_serialization::{
6 Deserializer, SerializeError, Serializer, U32VarIntDeserializer, U32VarIntSerializer,
7};
8use nom::error::{ContextError, ParseError};
9use nom::{error::context, multi::length_count, sequence::tuple, IResult, Parser};
10use serde::{Deserialize, Serialize};
11use std::ops::Bound::Included;
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct BootstrapableGraph {
16 pub final_blocks: Vec<ExportActiveBlock>,
18}
19
20#[derive(Default)]
22pub struct BootstrapableGraphSerializer {
23 block_count_serializer: U32VarIntSerializer,
24 export_active_block_serializer: ExportActiveBlockSerializer,
25}
26
27impl BootstrapableGraphSerializer {
28 pub fn new() -> Self {
30 Self {
31 block_count_serializer: U32VarIntSerializer::new(),
32 export_active_block_serializer: ExportActiveBlockSerializer::new(),
33 }
34 }
35}
36
37impl Serializer<BootstrapableGraph> for BootstrapableGraphSerializer {
38 fn serialize(
51 &self,
52 value: &BootstrapableGraph,
53 buffer: &mut Vec<u8>,
54 ) -> Result<(), SerializeError> {
55 self.block_count_serializer.serialize(
57 &value
58 .final_blocks
59 .len()
60 .try_into()
61 .map_err(|_| SerializeError::NumberTooBig("Too many final blocks".to_string()))?,
62 buffer,
63 )?;
64
65 for export_active_block in &value.final_blocks {
67 self.export_active_block_serializer
68 .serialize(export_active_block, buffer)?;
69 }
70
71 Ok(())
72 }
73}
74
75pub struct BootstrapableGraphDeserializer {
77 block_count_deserializer: U32VarIntDeserializer,
78 export_active_block_deserializer: ExportActiveBlockDeserializer,
79}
80
81impl BootstrapableGraphDeserializer {
82 #[allow(clippy::too_many_arguments)]
84 pub fn new(block_der_args: BlockDeserializerArgs, max_bootstrap_blocks: u32) -> Self {
85 Self {
86 block_count_deserializer: U32VarIntDeserializer::new(
87 Included(0),
88 Included(max_bootstrap_blocks),
89 ),
90 export_active_block_deserializer: ExportActiveBlockDeserializer::new(block_der_args),
91 }
92 }
93}
94
95impl Deserializer<BootstrapableGraph> for BootstrapableGraphDeserializer {
96 fn deserialize<'a, E: ParseError<&'a [u8]> + ContextError<&'a [u8]>>(
118 &self,
119 buffer: &'a [u8],
120 ) -> IResult<&'a [u8], BootstrapableGraph, E> {
121 context(
122 "Failed BootstrapableGraph deserialization",
123 tuple((context(
124 "Failed active_blocks deserialization",
125 length_count(
126 context("Failed final block count deserialization", |input| {
127 self.block_count_deserializer.deserialize(input)
128 }),
129 context("Failed export_active_block deserialization", |input| {
130 self.export_active_block_deserializer.deserialize(input)
131 }),
132 ),
133 ),)),
134 )
135 .map(|(final_blocks,)| BootstrapableGraph { final_blocks })
136 .parse(buffer)
137 }
138}