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
use crypto::digest::Digest;
use merkledigest::{ MerkleDigest };
pub use proof::{
Proof,
ProofBlock,
Positioned
};
pub enum Tree<T> {
Leaf {
hash: Vec<u8>,
value: T
},
Node {
hash: Vec<u8>,
left: Box<Tree<T>>,
right: Box<Tree<T>>
}
}
impl <T> Tree<T> where T: Into<Vec<u8>> + Clone {
pub fn new(hash: Vec<u8>, value: T) -> Self {
Tree::Leaf {
hash: hash,
value: value
}
}
pub fn make_leaf<D: Digest>(digest: &mut D, value: T) -> Tree<T> {
let hash = digest.hash_bytes(&value.clone().into());
Tree::new(hash, value)
}
pub fn get_hash(&self) -> &Vec<u8> {
match *self {
Tree::Leaf { ref hash, .. } => hash,
Tree::Node { ref hash, .. } => hash
}
}
}