arnaucube
arnaucube/go-merkletree-oldPublic Self-hosted repository
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}