use alloc::vec::Vec;
use super::{AdviceMap, DebugInfo, MastForest, MastForestError, serialization};
use crate::serde::{BudgetedReader, DeserializationError, SliceReader};
#[derive(Debug, Clone)]
pub struct UntrustedMastForest {
pub(super) bytes: Vec<u8>,
pub(super) layout: serialization::ForestLayout,
pub(super) advice_map: AdviceMap,
pub(super) debug_info: DebugInfo,
pub(super) remaining_allocation_budget: Option<usize>,
}
impl UntrustedMastForest {
pub fn validate(self) -> Result<MastForest, MastForestError> {
let is_hashless = self.layout.is_hashless();
let forest = self.into_materialized().map_err(MastForestError::Deserialization)?;
if !is_hashless {
forest.validate_node_hashes()?;
}
forest.validate()?;
Ok(forest)
}
pub fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError> {
Self::read_from_bytes_with_budgets(
bytes,
bytes.len(),
serialization::default_untrusted_allocation_budget(bytes.len()),
)
}
pub fn read_from_bytes_with_flags(bytes: &[u8]) -> Result<(Self, u8), DeserializationError> {
Self::read_from_bytes_with_budgets_and_flags(
bytes,
bytes.len(),
serialization::default_untrusted_allocation_budget(bytes.len()),
)
}
pub fn read_from_bytes_with_budget(
bytes: &[u8],
budget: usize,
) -> Result<Self, DeserializationError> {
let mut reader = BudgetedReader::new(SliceReader::new(bytes), budget);
serialization::read_untrusted_with_flags(&mut reader).map(|(forest, _flags)| forest)
}
pub fn read_from_bytes_with_budget_and_flags(
bytes: &[u8],
budget: usize,
) -> Result<(Self, u8), DeserializationError> {
let mut reader = BudgetedReader::new(SliceReader::new(bytes), budget);
serialization::read_untrusted_with_flags(&mut reader)
}
pub fn read_from_bytes_with_budgets(
bytes: &[u8],
parsing_budget: usize,
validation_budget: usize,
) -> Result<Self, DeserializationError> {
let mut reader = BudgetedReader::new(SliceReader::new(bytes), parsing_budget);
serialization::read_untrusted_with_flags_and_allocation_budget(
&mut reader,
validation_budget,
)
.map(|(forest, _flags)| forest)
}
pub fn read_from_bytes_with_budgets_and_flags(
bytes: &[u8],
parsing_budget: usize,
validation_budget: usize,
) -> Result<(Self, u8), DeserializationError> {
let mut reader = BudgetedReader::new(SliceReader::new(bytes), parsing_budget);
serialization::read_untrusted_with_flags_and_allocation_budget(
&mut reader,
validation_budget,
)
}
}