@@ -4335,3 +4335,153 @@ func (cmd *ClusterLinksCmd) readReply(rd *proto.Reader) error {
4335
4335
4336
4336
return nil
4337
4337
}
4338
+
4339
+ // ------------------------------------------------------------------------------------------------------------------
4340
+
4341
+ type SlotRange struct {
4342
+ Start int64
4343
+ End int64
4344
+ }
4345
+
4346
+ type Node struct {
4347
+ ID string
4348
+ Endpoint string
4349
+ IP string
4350
+ Hostname string
4351
+ Port int64
4352
+ TLSPort int64
4353
+ Role string
4354
+ ReplicationOffset int64
4355
+ Health string
4356
+ }
4357
+
4358
+ type ClusterShard struct {
4359
+ Slots []SlotRange
4360
+ Nodes []Node
4361
+ }
4362
+
4363
+ type ClusterShardsCmd struct {
4364
+ baseCmd
4365
+
4366
+ val []ClusterShard
4367
+ }
4368
+
4369
+ var _ Cmder = (* ClusterShardsCmd )(nil )
4370
+
4371
+ func NewClusterShardsCmd (ctx context.Context , args ... interface {}) * ClusterShardsCmd {
4372
+ return & ClusterShardsCmd {
4373
+ baseCmd : baseCmd {
4374
+ ctx : ctx ,
4375
+ args : args ,
4376
+ },
4377
+ }
4378
+ }
4379
+
4380
+ func (cmd * ClusterShardsCmd ) SetVal (val []ClusterShard ) {
4381
+ cmd .val = val
4382
+ }
4383
+
4384
+ func (cmd * ClusterShardsCmd ) Val () []ClusterShard {
4385
+ return cmd .val
4386
+ }
4387
+
4388
+ func (cmd * ClusterShardsCmd ) Result () ([]ClusterShard , error ) {
4389
+ return cmd .Val (), cmd .Err ()
4390
+ }
4391
+
4392
+ func (cmd * ClusterShardsCmd ) String () string {
4393
+ return cmdString (cmd , cmd .val )
4394
+ }
4395
+
4396
+ func (cmd * ClusterShardsCmd ) readReply (rd * proto.Reader ) error {
4397
+ n , err := rd .ReadArrayLen ()
4398
+ if err != nil {
4399
+ return err
4400
+ }
4401
+ cmd .val = make ([]ClusterShard , n )
4402
+
4403
+ for i := 0 ; i < n ; i ++ {
4404
+ m , err := rd .ReadMapLen ()
4405
+ if err != nil {
4406
+ return err
4407
+ }
4408
+
4409
+ for j := 0 ; j < m ; j ++ {
4410
+ key , err := rd .ReadString ()
4411
+ if err != nil {
4412
+ return err
4413
+ }
4414
+
4415
+ switch key {
4416
+ case "slots" :
4417
+ l , err := rd .ReadArrayLen ()
4418
+ if err != nil {
4419
+ return err
4420
+ }
4421
+ for k := 0 ; k < l ; k += 2 {
4422
+ start , err := rd .ReadInt ()
4423
+ if err != nil {
4424
+ return err
4425
+ }
4426
+
4427
+ end , err := rd .ReadInt ()
4428
+ if err != nil {
4429
+ return err
4430
+ }
4431
+
4432
+ cmd .val [i ].Slots = append (cmd .val [i ].Slots , SlotRange {Start : start , End : end })
4433
+ }
4434
+ case "nodes" :
4435
+ nodesLen , err := rd .ReadArrayLen ()
4436
+ if err != nil {
4437
+ return err
4438
+ }
4439
+ cmd .val [i ].Nodes = make ([]Node , nodesLen )
4440
+ for k := 0 ; k < nodesLen ; k ++ {
4441
+ nodeMapLen , err := rd .ReadMapLen ()
4442
+ if err != nil {
4443
+ return err
4444
+ }
4445
+
4446
+ for l := 0 ; l < nodeMapLen ; l ++ {
4447
+ nodeKey , err := rd .ReadString ()
4448
+ if err != nil {
4449
+ return err
4450
+ }
4451
+
4452
+ switch nodeKey {
4453
+ case "id" :
4454
+ cmd .val [i ].Nodes [k ].ID , err = rd .ReadString ()
4455
+ case "endpoint" :
4456
+ cmd .val [i ].Nodes [k ].Endpoint , err = rd .ReadString ()
4457
+ case "ip" :
4458
+ cmd .val [i ].Nodes [k ].IP , err = rd .ReadString ()
4459
+ case "hostname" :
4460
+ cmd .val [i ].Nodes [k ].Hostname , err = rd .ReadString ()
4461
+ case "port" :
4462
+ cmd .val [i ].Nodes [k ].Port , err = rd .ReadInt ()
4463
+ case "tls-port" :
4464
+ cmd .val [i ].Nodes [k ].TLSPort , err = rd .ReadInt ()
4465
+ case "role" :
4466
+ cmd .val [i ].Nodes [k ].Role , err = rd .ReadString ()
4467
+ case "replication-offset" :
4468
+ cmd .val [i ].Nodes [k ].ReplicationOffset , err = rd .ReadInt ()
4469
+ case "health" :
4470
+ cmd .val [i ].Nodes [k ].Health , err = rd .ReadString ()
4471
+ default :
4472
+ return fmt .Errorf ("redis: unexpected key %q in CLUSTER SHARDS node reply" , nodeKey )
4473
+ }
4474
+
4475
+ if err != nil {
4476
+ return err
4477
+ }
4478
+ }
4479
+ }
4480
+ default :
4481
+ return fmt .Errorf ("redis: unexpected key %q in CLUSTER SHARDS reply" , key )
4482
+ }
4483
+ }
4484
+ }
4485
+
4486
+ return nil
4487
+ }
0 commit comments