1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
use crate::{
common::{
error::DeserializeError,
Bytes32,
Prefix,
PrefixError,
},
sparse::Node,
};
/// **Leaf buffer:**
///
/// | Allocation | Data |
/// |------------|----------------------------|
/// | `00 - 04` | Height (4 bytes) |
/// | `04 - 05` | Prefix (1 byte, `0x00`) |
/// | `05 - 37` | hash(Key) (32 bytes) |
/// | `37 - 69` | hash(Data) (32 bytes) |
///
/// **Node buffer:**
///
/// | Allocation | Data |
/// |------------|----------------------------|
/// | `00 - 04` | Height (4 bytes) |
/// | `04 - 05` | Prefix (1 byte, `0x01`) |
/// | `05 - 37` | Left child key (32 bytes) |
/// | `37 - 69` | Right child key (32 bytes) |
pub type Primitive = (u32, u8, Bytes32, Bytes32);
trait PrimitiveView {
fn height(&self) -> u32;
fn prefix(&self) -> Result<Prefix, PrefixError>;
fn bytes_lo(&self) -> &Bytes32;
fn bytes_hi(&self) -> &Bytes32;
}
impl PrimitiveView for Primitive {
fn height(&self) -> u32 {
self.0
}
fn prefix(&self) -> Result<Prefix, PrefixError> {
Prefix::try_from(self.1)
}
fn bytes_lo(&self) -> &Bytes32 {
&self.2
}
fn bytes_hi(&self) -> &Bytes32 {
&self.3
}
}
impl From<&Node> for Primitive {
fn from(node: &Node) -> Self {
(
node.height(),
node.prefix() as u8,
*node.bytes_lo(),
*node.bytes_hi(),
)
}
}
impl TryFrom<Primitive> for Node {
type Error = DeserializeError;
fn try_from(primitive: Primitive) -> Result<Self, Self::Error> {
let height = primitive.height();
let prefix = primitive.prefix()?;
let bytes_lo = *primitive.bytes_lo();
let bytes_hi = *primitive.bytes_hi();
let node = Self::new(height, prefix, bytes_lo, bytes_hi);
Ok(node)
}
}