@@ -18,10 +18,9 @@ import (
18
18
"encoding/json"
19
19
"fmt"
20
20
"os"
21
- "strconv"
22
- "strings"
21
+ "slices"
23
22
24
- clientv3 "go.etcd.io/etcd/client/v3"
23
+ v3 "go.etcd.io/etcd/client/v3"
25
24
)
26
25
27
26
type jsonPrinter struct {
@@ -36,65 +35,65 @@ func newJSONPrinter(isHex bool) printer {
36
35
}
37
36
}
38
37
39
- func (p * jsonPrinter ) EndpointHealth (r []epHealth ) { printJSON (r ) }
40
- func (p * jsonPrinter ) EndpointStatus (r []epStatus ) { printJSON (r ) }
41
- func (p * jsonPrinter ) EndpointHashKV (r []epHashKV ) { printJSON (r ) }
38
+ func (p * jsonPrinter ) EndpointHealth (r []epHealth ) { p . printJSON (r ) }
39
+ func (p * jsonPrinter ) EndpointStatus (r []epStatus ) { p . printJSON (r ) }
40
+ func (p * jsonPrinter ) EndpointHashKV (r []epHashKV ) { p . printJSON (r ) }
42
41
43
- func (p * jsonPrinter ) MemberList (r clientv3.MemberListResponse ) {
44
- if p .isHex {
45
- printMemberListWithHexJSON (r )
46
- } else {
47
- printJSON (r )
42
+ func (p * jsonPrinter ) MemberAdd (r v3.MemberAddResponse ) { p .printJSON (r ) }
43
+ func (p * jsonPrinter ) MemberList (r v3.MemberListResponse ) { p .printJSON (r ) }
44
+
45
+ func printJSON (v any ) {
46
+ b , err := json .Marshal (v )
47
+ if err != nil {
48
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
49
+ return
48
50
}
51
+ fmt .Println (string (b ))
49
52
}
50
53
51
- func printJSON (v any ) {
54
+ func ( p * jsonPrinter ) printJSON (v any ) {
52
55
b , err := json .Marshal (v )
53
56
if err != nil {
54
57
fmt .Fprintf (os .Stderr , "%v\n " , err )
55
58
return
56
59
}
60
+
61
+ if ! p .isHex {
62
+ fmt .Println (string (b ))
63
+ return
64
+ }
65
+
66
+ var data any
67
+ if err := json .Unmarshal (b , & data ); err != nil {
68
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
69
+ return
70
+ }
71
+
72
+ convertFieldsToHex (data )
73
+ b , err = json .Marshal (data )
74
+ if err != nil {
75
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
76
+ return
77
+ }
57
78
fmt .Println (string (b ))
58
79
}
59
80
60
- func printMemberListWithHexJSON (r clientv3.MemberListResponse ) {
61
- var buffer strings.Builder
62
- var b []byte
63
- buffer .WriteString ("{\" header\" :{\" cluster_id\" :\" " )
64
- b = strconv .AppendUint (nil , r .Header .ClusterId , 16 )
65
- buffer .Write (b )
66
- buffer .WriteString ("\" ,\" member_id\" :\" " )
67
- b = strconv .AppendUint (nil , r .Header .MemberId , 16 )
68
- buffer .Write (b )
69
- buffer .WriteString ("\" ,\" raft_term\" :" )
70
- b = strconv .AppendUint (nil , r .Header .RaftTerm , 10 )
71
- buffer .Write (b )
72
- buffer .WriteByte ('}' )
73
- for i := 0 ; i < len (r .Members ); i ++ {
74
- if i == 0 {
75
- buffer .WriteString (",\" members\" :[{\" ID\" :\" " )
76
- } else {
77
- buffer .WriteString (",{\" ID\" :\" " )
78
- }
79
- b = strconv .AppendUint (nil , r .Members [i ].ID , 16 )
80
- buffer .Write (b )
81
- buffer .WriteString ("\" ,\" name\" :\" " + r .Members [i ].Name + "\" ," + "\" peerURLs\" :" )
82
- b , err := json .Marshal (r .Members [i ].PeerURLs )
83
- if err != nil {
84
- return
85
- }
86
- buffer .Write (b )
87
- buffer .WriteString (",\" clientURLs\" :" )
88
- b , err = json .Marshal (r .Members [i ].ClientURLs )
89
- if err != nil {
90
- return
81
+ func convertFieldsToHex (data any ) {
82
+ keysToConvert := []string {"cluster_id" , "member_id" , "ID" , "leader" }
83
+
84
+ switch v := data .(type ) {
85
+ case map [string ]any :
86
+ for key , val := range v {
87
+ if slices .Contains (keysToConvert , key ) {
88
+ if num , ok := val .(float64 ); ok {
89
+ v [key ] = fmt .Sprintf ("%x" , uint64 (num ))
90
+ }
91
+ }
92
+ convertFieldsToHex (val )
91
93
}
92
- buffer .Write (b )
93
- buffer .WriteByte ('}' )
94
- if i == len (r .Members )- 1 {
95
- buffer .WriteString ("]" )
94
+ case []any :
95
+ for _ , item := range v {
96
+ convertFieldsToHex (item )
96
97
}
97
98
}
98
- buffer .WriteString ("}" )
99
- fmt .Println (buffer .String ())
100
99
}
0 commit comments