zebra_chain/
subtree.rs
1use std::{fmt, num::TryFromIntError};
4
5use serde::{Deserialize, Serialize};
6
7use crate::block::Height;
8
9#[cfg(any(test, feature = "proptest-impl"))]
10use proptest_derive::Arbitrary;
11
12pub const TRACKED_SUBTREE_HEIGHT: u8 = 16;
14
15#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
18#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
19#[serde(transparent)]
20pub struct NoteCommitmentSubtreeIndex(pub u16);
21
22impl fmt::Display for NoteCommitmentSubtreeIndex {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 f.write_str(&self.0.to_string())
25 }
26}
27
28impl From<u16> for NoteCommitmentSubtreeIndex {
29 fn from(value: u16) -> Self {
30 Self(value)
31 }
32}
33
34impl TryFrom<u64> for NoteCommitmentSubtreeIndex {
35 type Error = TryFromIntError;
36
37 fn try_from(value: u64) -> Result<Self, Self::Error> {
38 u16::try_from(value).map(Self)
39 }
40}
41
42impl From<NoteCommitmentSubtreeIndex> for u64 {
45 fn from(value: NoteCommitmentSubtreeIndex) -> Self {
46 value.0.into()
47 }
48}
49
50#[derive(Copy, Clone, Debug, Eq, PartialEq)]
57#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
58pub struct NoteCommitmentSubtree<SubtreeRoot> {
59 pub index: NoteCommitmentSubtreeIndex,
61 pub root: SubtreeRoot,
63 pub end_height: Height,
65}
66
67impl<SubtreeRoot> NoteCommitmentSubtree<SubtreeRoot> {
68 pub fn new(
70 index: impl Into<NoteCommitmentSubtreeIndex>,
71 end_height: Height,
72 root: SubtreeRoot,
73 ) -> Self {
74 let index = index.into();
75 Self {
76 index,
77 end_height,
78 root,
79 }
80 }
81
82 pub fn into_data(self) -> NoteCommitmentSubtreeData<SubtreeRoot> {
84 NoteCommitmentSubtreeData::new(self.end_height, self.root)
85 }
86}
87
88#[derive(Copy, Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
91#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
92pub struct NoteCommitmentSubtreeData<SubtreeRoot> {
93 pub root: SubtreeRoot,
95
96 pub end_height: Height,
98}
99
100impl<SubtreeRoot> NoteCommitmentSubtreeData<SubtreeRoot> {
101 pub fn new(end_height: Height, root: SubtreeRoot) -> Self {
103 Self { end_height, root }
104 }
105
106 pub fn with_index(
108 self,
109 index: impl Into<NoteCommitmentSubtreeIndex>,
110 ) -> NoteCommitmentSubtree<SubtreeRoot> {
111 NoteCommitmentSubtree::new(index, self.end_height, self.root)
112 }
113}