commonware_storage/merkle/
read.rs1use crate::merkle::{Family, Location, Position};
4use alloc::sync::Arc;
5use commonware_cryptography::Digest;
6use core::ops::Range;
7
8pub trait Readable: Send + Sync {
13 type Family: Family;
15
16 type Digest: Digest;
18
19 type Error;
21
22 fn size(&self) -> Position<Self::Family>;
24
25 fn get_node(&self, pos: Position<Self::Family>) -> Option<Self::Digest>;
27
28 fn pruning_boundary(&self) -> Location<Self::Family>;
30
31 fn leaves(&self) -> Location<Self::Family> {
33 Location::try_from(self.size()).expect("invalid merkle size")
34 }
35
36 fn bounds(&self) -> Range<Location<Self::Family>> {
38 self.pruning_boundary()..self.leaves()
39 }
40}
41
42impl<T: Readable> Readable for Arc<T> {
43 type Family = T::Family;
44 type Digest = T::Digest;
45 type Error = T::Error;
46
47 fn size(&self) -> Position<Self::Family> {
48 (**self).size()
49 }
50
51 fn get_node(&self, pos: Position<Self::Family>) -> Option<Self::Digest> {
52 (**self).get_node(pos)
53 }
54
55 fn pruning_boundary(&self) -> Location<Self::Family> {
56 (**self).pruning_boundary()
57 }
58}