/
prefix.go
85 lines (75 loc) · 2.14 KB
/
prefix.go
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
78
79
80
81
82
83
84
85
package utils
import (
"fmt"
"strconv"
"strings"
"github.com/DeBankDeFi/nodex/pkg/pb"
)
func TopicPrefix(env, chainId, role string) string {
return fmt.Sprintf("%s/%s/%s", env, chainId, role)
}
func CommonPrefix(env, chainId, role string, blockTy pb.BlockInfo_BlockType) string {
switch blockTy {
case pb.BlockInfo_HEADER:
return fmt.Sprintf("%s/header", TopicPrefix(env, chainId, role))
case pb.BlockInfo_DATA:
return fmt.Sprintf("%s/block", TopicPrefix(env, chainId, role))
default:
panic("invalid block type")
}
}
func Topic(env, chainId, role string) string {
return fmt.Sprintf("%s-%s-%s-header", env, chainId, role)
}
func InfoToPrefix(info *pb.BlockInfo) string {
switch info.BlockType {
case pb.BlockInfo_HEADER:
return HeaderPrefix(info)
case pb.BlockInfo_DATA:
return BlockPrefix(info)
default:
panic("invalid block type")
}
}
func HeaderPrefix(info *pb.BlockInfo) string {
commonPrefix := CommonPrefix(info.Env, info.ChainId, info.Role, pb.BlockInfo_HEADER)
return fmt.Sprintf("%s/%012d/%012d/%s", commonPrefix, info.BlockNum, info.MsgOffset, info.BlockHash)
}
func BlockPrefix(info *pb.BlockInfo) string {
commonPrefix := CommonPrefix(info.Env, info.ChainId, info.Role, pb.BlockInfo_DATA)
return fmt.Sprintf("%s/%s", commonPrefix, info.BlockHash)
}
func PrefixToHeaderInfo(key string) (info *pb.BlockInfo, err error) {
info = &pb.BlockInfo{}
keys := strings.Split(key, "/")
if len(keys) != 7 {
return nil, fmt.Errorf("invalid key: %s", key)
}
info.Env = keys[0]
info.ChainId = keys[1]
info.Role = keys[2]
info.BlockType = pb.BlockInfo_HEADER
info.BlockNum, err = strconv.ParseInt(keys[4], 10, 64)
if err != nil {
return nil, err
}
info.MsgOffset, err = strconv.ParseInt(keys[5], 10, 64)
if err != nil {
return nil, err
}
info.BlockHash = keys[6]
return info, nil
}
func PrefixToBlockInfo(key string) (info *pb.BlockInfo, err error) {
info = &pb.BlockInfo{}
keys := strings.Split(key, "/")
if len(keys) != 5 {
return nil, fmt.Errorf("invalid key: %s", key)
}
info.ChainId = keys[0]
info.Env = keys[1]
info.Role = keys[2]
info.BlockType = pb.BlockInfo_DATA
info.BlockHash = keys[4]
return info, nil
}