@@ -17,11 +17,9 @@ package command
17
17
import (
18
18
"encoding/json"
19
19
"fmt"
20
- "os"
21
- "strconv"
22
- "strings"
23
20
24
- clientv3 "go.etcd.io/etcd/client/v3"
21
+ pb "go.etcd.io/etcd/api/v3/etcdserverpb"
22
+ v3 "go.etcd.io/etcd/client/v3"
25
23
)
26
24
27
25
type jsonPrinter struct {
@@ -36,65 +34,130 @@ func newJSONPrinter(isHex bool) printer {
36
34
}
37
35
}
38
36
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 ) }
37
+ type (
38
+ HexResponseHeader pb.ResponseHeader
39
+ HexMember pb.Member
40
+ )
42
41
43
- func (p * jsonPrinter ) MemberList (r clientv3.MemberListResponse ) {
44
- if p .isHex {
45
- printMemberListWithHexJSON (r )
46
- } else {
47
- printJSON (r )
48
- }
42
+ func (h * HexResponseHeader ) MarshalJSON () ([]byte , error ) {
43
+ type Alias pb.ResponseHeader
44
+
45
+ return json .Marshal (& struct {
46
+ ClusterID string `json:"cluster_id"`
47
+ MemberID string `json:"member_id"`
48
+ Alias
49
+ }{
50
+ ClusterID : fmt .Sprintf ("%x" , h .ClusterId ),
51
+ MemberID : fmt .Sprintf ("%x" , h .MemberId ),
52
+ Alias : (Alias )(* h ),
53
+ })
54
+ }
55
+
56
+ func (m * HexMember ) MarshalJSON () ([]byte , error ) {
57
+ type Alias pb.Member
58
+
59
+ return json .Marshal (& struct {
60
+ ID string `json:"ID"`
61
+ Alias
62
+ }{
63
+ ID : fmt .Sprintf ("%x" , m .ID ),
64
+ Alias : (Alias )(* m ),
65
+ })
49
66
}
50
67
68
+ func (p * jsonPrinter ) MemberAdd (r v3.MemberAddResponse ) { p .printJSON (r ) }
69
+ func (p * jsonPrinter ) MemberList (r v3.MemberListResponse ) { p .printJSON (r ) }
70
+ func (p * jsonPrinter ) MemberPromote (id uint64 , r v3.MemberPromoteResponse ) { p .printJSON (r ) }
71
+ func (p * jsonPrinter ) MemberRemove (id uint64 , r v3.MemberRemoveResponse ) { p .printJSON (r ) }
72
+ func (p * jsonPrinter ) MemberUpdate (id uint64 , r v3.MemberUpdateResponse ) { p .printJSON (r ) }
73
+
51
74
func printJSON (v any ) {
52
- b , err := json .Marshal (v )
53
- if err != nil {
54
- fmt .Fprintf (os .Stderr , "%v\n " , err )
55
- return
56
- }
75
+ b , _ := json .Marshal (v )
57
76
fmt .Println (string (b ))
58
77
}
59
78
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\" :\" " )
79
+ func (p * jsonPrinter ) printJSON (v any ) {
80
+ var data any
81
+
82
+ if ! p .isHex {
83
+ printJSON (v )
84
+ return
85
+ }
86
+
87
+ switch r := v .(type ) {
88
+ case v3.MemberAddResponse :
89
+ type Alias v3.MemberAddResponse
90
+
91
+ data = & struct {
92
+ Header * HexResponseHeader `json:"header"`
93
+ Member * HexMember `json:"member"`
94
+ Members []* HexMember `json:"members"`
95
+ * Alias
96
+ }{
97
+ Header : (* HexResponseHeader )(r .Header ),
98
+ Member : (* HexMember )(r .Member ),
99
+ Members : toHexMembers (r .Members ),
100
+ Alias : (* Alias )(& r ),
78
101
}
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
102
+ case v3.MemberListResponse :
103
+ type Alias v3.MemberListResponse
104
+
105
+ data = & struct {
106
+ Header * HexResponseHeader `json:"header"`
107
+ Members []* HexMember `json:"members"`
108
+ * Alias
109
+ }{
110
+ Header : (* HexResponseHeader )(r .Header ),
111
+ Members : toHexMembers (r .Members ),
112
+ Alias : (* Alias )(& r ),
85
113
}
86
- buffer .Write (b )
87
- buffer .WriteString (",\" clientURLs\" :" )
88
- b , err = json .Marshal (r .Members [i ].ClientURLs )
89
- if err != nil {
90
- return
114
+ case v3.MemberPromoteResponse :
115
+ type Alias v3.MemberPromoteResponse
116
+
117
+ data = & struct {
118
+ Header * HexResponseHeader `json:"header"`
119
+ Members []* HexMember `json:"members"`
120
+ * Alias
121
+ }{
122
+ Header : (* HexResponseHeader )(r .Header ),
123
+ Members : toHexMembers (r .Members ),
124
+ Alias : (* Alias )(& r ),
91
125
}
92
- buffer .Write (b )
93
- buffer .WriteByte ('}' )
94
- if i == len (r .Members )- 1 {
95
- buffer .WriteString ("]" )
126
+ case v3.MemberRemoveResponse :
127
+ type Alias v3.MemberRemoveResponse
128
+
129
+ data = & struct {
130
+ Header * HexResponseHeader `json:"header"`
131
+ Members []* HexMember `json:"members"`
132
+ * Alias
133
+ }{
134
+ Header : (* HexResponseHeader )(r .Header ),
135
+ Members : toHexMembers (r .Members ),
136
+ Alias : (* Alias )(& r ),
96
137
}
138
+ case v3.MemberUpdateResponse :
139
+ type Alias v3.MemberUpdateResponse
140
+
141
+ data = & struct {
142
+ Header * HexResponseHeader `json:"header"`
143
+ Members []* HexMember `json:"members"`
144
+ * Alias
145
+ }{
146
+ Header : (* HexResponseHeader )(r .Header ),
147
+ Members : toHexMembers (r .Members ),
148
+ Alias : (* Alias )(& r ),
149
+ }
150
+ default :
151
+ data = v
152
+ }
153
+
154
+ printJSON (data )
155
+ }
156
+
157
+ func toHexMembers (members []* pb.Member ) []* HexMember {
158
+ hexMembers := make ([]* HexMember , len (members ))
159
+ for i , member := range members {
160
+ hexMembers [i ] = (* HexMember )(member )
97
161
}
98
- buffer .WriteString ("}" )
99
- fmt .Println (buffer .String ())
162
+ return hexMembers
100
163
}
0 commit comments