go-merkletree-old/print.go
print.goRaw
1package merkletree
2
3import (
4 "encoding/hex"
5 "fmt"
6
7 "github.com/fatih/color"
8)
9
10func (mt *MerkleTree) printLevel(parent Hash, iLevel int, maxLevel int) {
11 for i := 0; i < iLevel; i++ {
12 fmt.Print(" ")
13 }
14 fmt.Print("level ")
15 fmt.Print(iLevel)
16 fmt.Print(" - ")
17 fmt.Print("'" + parent.Hex() + "' = ")
18 nodeType, _, nodeBytes, err := mt.Get(parent)
19 if err != nil {
20 color.Red(err.Error())
21 }
22 var node treeNode
23 if nodeType == byte(normalNodeType) {
24 node = parseNodeBytes(nodeBytes)
25 color.Blue("'" + node.ChildL.Hex() + "' - '" + node.ChildR.Hex() + "'")
26 } else if nodeType == byte(valueNodeType) {
27 color.Green("value")
28 } else if nodeType == byte(finalNodeType) { //typ==FINAL_NODE
29 fmt.Print("[FinalTree]:")
30 color.Cyan("final tree node: " + HashBytes(nodeBytes).Hex())
31 _, _, leafNodeBytes, err := mt.Get(HashBytes(nodeBytes))
32 if err != nil {
33 color.Red(err.Error())
34 }
35 for i := 0; i < iLevel; i++ {
36 fmt.Print(" ")
37 }
38 color.Cyan(" leaf value: 0x" + hex.EncodeToString(leafNodeBytes))
39 } else {
40 //EMPTY_NODE
41 fmt.Print("[EmptyBranch]:")
42 fmt.Println(EmptyNodeValue.Bytes())
43 }
44 iLevel++
45 if len(node.ChildR) > 0 && iLevel < maxLevel && nodeType != byte(EmptyNodeType) && nodeType != byte(finalNodeType) {
46 mt.printLevel(node.ChildL, iLevel, maxLevel)
47 mt.printLevel(node.ChildR, iLevel, maxLevel)
48 }
49}
50
51// PrintFullMT prints the tree in the terminal, all the levels with all the nodes
52func (mt *MerkleTree) PrintFullMT() {
53 mt.printLevel(mt.root, 0, mt.numLevels-1)
54 fmt.Print("root: ")
55 color.Yellow(mt.Root().Hex())
56}
57
58// PrintLevelsMT prints the tree in the terminal until a specified depth
59func (mt *MerkleTree) PrintLevelsMT(maxLevel int) {
60 mt.printLevel(mt.root, 0, mt.numLevels-1-maxLevel)
61 fmt.Print("root: ")
62 color.Yellow(mt.Root().Hex())
63}