algae_merkle/
shape.rs

1/*
2   Appellation: shape <merkle>
3   Contrib: FL03 <jo3mccain@icloud.com>
4   Description: ... Summary ...
5*/
6use serde::{Deserialize, Serialize};
7
8pub trait MerkleShape {
9    fn depth(&self) -> usize;
10    fn leafs(&self) -> usize;
11    fn shape(&self) -> (usize, usize, usize) {
12        (self.depth(), self.leafs(), self.size())
13    }
14    fn size(&self) -> usize;
15}
16
17#[derive(
18    Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
19)]
20pub struct MerkleDimension {
21    pub depth: usize,
22    pub leafs: usize,
23    pub size: usize,
24}
25
26impl MerkleDimension {
27    pub fn new(depth: usize, leafs: usize, size: usize) -> Self {
28        Self { depth, leafs, size }
29    }
30}
31
32impl MerkleShape for MerkleDimension {
33    fn depth(&self) -> usize {
34        self.depth
35    }
36
37    fn leafs(&self) -> usize {
38        self.leafs
39    }
40    fn size(&self) -> usize {
41        self.size
42    }
43}
44
45impl std::fmt::Display for MerkleDimension {
46    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47        write!(f, "({}, {}, {})", self.depth, self.leafs, self.size)
48    }
49}
50
51impl From<Box<dyn MerkleShape>> for MerkleDimension {
52    fn from(data: Box<dyn MerkleShape>) -> Self {
53        Self::from(data.shape())
54    }
55}
56
57impl From<(usize, usize, usize)> for MerkleDimension {
58    fn from(data: (usize, usize, usize)) -> Self {
59        Self::new(data.0, data.1, data.2)
60    }
61}