@@ -4335,3 +4335,153 @@ func (cmd *ClusterLinksCmd) readReply(rd *proto.Reader) error {
43354335
43364336 return nil
43374337}
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