Skip to content

Commit

Permalink
Add: Support for COMMAND LIST command (redis#2491)
Browse files Browse the repository at this point in the history
* feat: add support and tests for Command list command

Co-authored-by: Anuragkillswitch <[email protected]>
  • Loading branch information
SoulPancake and SoulPancake authored Mar 19, 2023
1 parent 30a6f71 commit 049d4f9
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
7 changes: 7 additions & 0 deletions command.go
Original file line number Diff line number Diff line change
Expand Up @@ -3992,3 +3992,10 @@ func (cmd *FunctionListCmd) readFunctions(rd *proto.Reader) ([]Function, error)
}
return functions, nil
}

type FilterBy struct {
Module string
ACLCat string
Pattern string
}

18 changes: 18 additions & 0 deletions commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ type Cmdable interface {
TxPipeline() Pipeliner

Command(ctx context.Context) *CommandsInfoCmd
CommandList(ctx context.Context, filter *FilterBy) *StringSliceCmd
ClientGetName(ctx context.Context) *StringCmd
Echo(ctx context.Context, message interface{}) *StringCmd
Ping(ctx context.Context) *StatusCmd
Expand Down Expand Up @@ -537,6 +538,23 @@ func (c cmdable) Command(ctx context.Context) *CommandsInfoCmd {
return cmd
}

func (c cmdable) CommandList(ctx context.Context, filter *FilterBy) *StringSliceCmd {
args := make([]interface{}, 0, 5)
args = append(args, "command", "list")
if filter != nil {
if filter.Module != "" {
args = append(args, "filterby", "module", filter.Module)
} else if filter.ACLCat != "" {
args = append(args, "filterby", "aclcat", filter.ACLCat)
} else if filter.Pattern != "" {
args = append(args, "filterby", "pattern", filter.Pattern)
}
}
cmd := NewStringSliceCmd(ctx, args...)
_ = c(ctx, cmd)
return cmd
}

// ClientGetName returns the name of the connection.
func (c cmdable) ClientGetName(ctx context.Context) *StringCmd {
cmd := NewStringCmd(ctx, "client", "getname")
Expand Down
51 changes: 51 additions & 0 deletions commands_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6277,6 +6277,57 @@ var _ = Describe("Commands", func() {
Expect(err).To(Equal(redis.Nil))
})

It("should return all command names", func() {
cmdList := client.CommandList(ctx, nil)
Expect(cmdList.Err()).NotTo(HaveOccurred())
cmdNames := cmdList.Val()

Expect(cmdNames).NotTo(BeEmpty())

// Assert that some expected commands are present in the list
Expect(cmdNames).To(ContainElement("get"))
Expect(cmdNames).To(ContainElement("set"))
Expect(cmdNames).To(ContainElement("hset"))
})

It("should filter commands by module", func() {
filter := &redis.FilterBy{
Module: "JSON",
}
cmdList := client.CommandList(ctx, filter)
Expect(cmdList.Err()).NotTo(HaveOccurred())
Expect(cmdList.Val()).To(HaveLen(0))
})

It("should filter commands by ACL category", func() {

filter := &redis.FilterBy{
ACLCat: "admin",
}

cmdList := client.CommandList(ctx, filter)
Expect(cmdList.Err()).NotTo(HaveOccurred())
cmdNames := cmdList.Val()

// Assert that the returned list only contains commands from the admin ACL category
Expect(len(cmdNames)).To(BeNumerically(">", 10))
})

It("should filter commands by pattern", func() {
filter := &redis.FilterBy{
Pattern: "*GET*",
}
cmdList := client.CommandList(ctx, filter)
Expect(cmdList.Err()).NotTo(HaveOccurred())
cmdNames := cmdList.Val()

// Assert that the returned list only contains commands that match the given pattern
Expect(cmdNames).To(ContainElement("get"))
Expect(cmdNames).To(ContainElement("getbit"))
Expect(cmdNames).To(ContainElement("getrange"))
Expect(cmdNames).NotTo(ContainElement("set"))
})

It("Dump and restores all libraries", func() {
err := client.FunctionLoad(ctx, lib1Code).Err()
Expect(err).NotTo(HaveOccurred())
Expand Down

0 comments on commit 049d4f9

Please sign in to comment.