|
1 | 1 | package redis
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "bufio" |
4 | 5 | "context"
|
5 | 6 | "fmt"
|
6 | 7 | "net"
|
| 8 | + "regexp" |
7 | 9 | "strconv"
|
8 | 10 | "strings"
|
9 | 11 | "time"
|
@@ -5298,3 +5300,84 @@ type LibraryInfo struct {
|
5298 | 5300 | LibName *string
|
5299 | 5301 | LibVer *string
|
5300 | 5302 | }
|
| 5303 | + |
| 5304 | +// ------------------------------------------- |
| 5305 | + |
| 5306 | +type InfoCmd struct { |
| 5307 | + baseCmd |
| 5308 | + val map[string]map[string]string |
| 5309 | +} |
| 5310 | + |
| 5311 | +var _ Cmder = (*InfoCmd)(nil) |
| 5312 | + |
| 5313 | +func NewInfoCmd(ctx context.Context, args ...interface{}) *InfoCmd { |
| 5314 | + return &InfoCmd{ |
| 5315 | + baseCmd: baseCmd{ |
| 5316 | + ctx: ctx, |
| 5317 | + args: args, |
| 5318 | + }, |
| 5319 | + } |
| 5320 | +} |
| 5321 | + |
| 5322 | +func (cmd *InfoCmd) SetVal(val map[string]map[string]string) { |
| 5323 | + cmd.val = val |
| 5324 | +} |
| 5325 | + |
| 5326 | +func (cmd *InfoCmd) Val() map[string]map[string]string { |
| 5327 | + return cmd.val |
| 5328 | +} |
| 5329 | + |
| 5330 | +func (cmd *InfoCmd) Result() (map[string]map[string]string, error) { |
| 5331 | + return cmd.Val(), cmd.Err() |
| 5332 | +} |
| 5333 | + |
| 5334 | +func (cmd *InfoCmd) String() string { |
| 5335 | + return cmdString(cmd, cmd.val) |
| 5336 | +} |
| 5337 | + |
| 5338 | +func (cmd *InfoCmd) readReply(rd *proto.Reader) error { |
| 5339 | + val, err := rd.ReadString() |
| 5340 | + if err != nil { |
| 5341 | + return err |
| 5342 | + } |
| 5343 | + |
| 5344 | + section := "" |
| 5345 | + scanner := bufio.NewScanner(strings.NewReader(val)) |
| 5346 | + moduleRe := regexp.MustCompile(`module:name=(.+?),(.+)$`) |
| 5347 | + |
| 5348 | + for scanner.Scan() { |
| 5349 | + line := scanner.Text() |
| 5350 | + if strings.HasPrefix(line, "#") { |
| 5351 | + if cmd.val == nil { |
| 5352 | + cmd.val = make(map[string]map[string]string) |
| 5353 | + } |
| 5354 | + section = strings.TrimPrefix(line, "# ") |
| 5355 | + cmd.val[section] = make(map[string]string) |
| 5356 | + } else if line != "" { |
| 5357 | + if section == "Modules" { |
| 5358 | + kv := moduleRe.FindStringSubmatch(line) |
| 5359 | + if len(kv) == 3 { |
| 5360 | + cmd.val[section][kv[1]] = kv[2] |
| 5361 | + } |
| 5362 | + } else { |
| 5363 | + kv := strings.SplitN(line, ":", 2) |
| 5364 | + if len(kv) == 2 { |
| 5365 | + cmd.val[section][kv[0]] = kv[1] |
| 5366 | + } |
| 5367 | + } |
| 5368 | + } |
| 5369 | + } |
| 5370 | + |
| 5371 | + return nil |
| 5372 | + |
| 5373 | +} |
| 5374 | + |
| 5375 | +func (cmd *InfoCmd) Item(section, key string) string { |
| 5376 | + if cmd.val == nil { |
| 5377 | + return "" |
| 5378 | + } else if cmd.val[section] == nil { |
| 5379 | + return "" |
| 5380 | + } else { |
| 5381 | + return cmd.val[section][key] |
| 5382 | + } |
| 5383 | +} |
0 commit comments