mirror of
https://github.com/nalgeon/redka.git
synced 2025-10-08 01:10:32 +08:00
command: string - strlen
This commit is contained in:
@@ -126,6 +126,8 @@ func Parse(args [][]byte) (redis.Cmd, error) {
|
|||||||
return str.ParseSetEX(b, 1000)
|
return str.ParseSetEX(b, 1000)
|
||||||
case "setnx":
|
case "setnx":
|
||||||
return str.ParseSetNX(b)
|
return str.ParseSetNX(b)
|
||||||
|
case "strlen":
|
||||||
|
return str.ParseStrlen(b)
|
||||||
|
|
||||||
// hash
|
// hash
|
||||||
case "hdel":
|
case "hdel":
|
||||||
|
37
internal/command/string/strlen.go
Normal file
37
internal/command/string/strlen.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package string
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nalgeon/redka/internal/core"
|
||||||
|
"github.com/nalgeon/redka/internal/redis"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Strlen returns the length of a string value.
|
||||||
|
// STRLEN key
|
||||||
|
// https://redis.io/commands/strlen
|
||||||
|
type Strlen struct {
|
||||||
|
redis.BaseCmd
|
||||||
|
key string
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseStrlen(b redis.BaseCmd) (Strlen, error) {
|
||||||
|
cmd := Strlen{BaseCmd: b}
|
||||||
|
if len(cmd.Args()) != 1 {
|
||||||
|
return Strlen{}, redis.ErrInvalidArgNum
|
||||||
|
}
|
||||||
|
cmd.key = string(cmd.Args()[0])
|
||||||
|
return cmd, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cmd Strlen) Run(w redis.Writer, red redis.Redka) (any, error) {
|
||||||
|
val, err := red.Str().Get(cmd.key)
|
||||||
|
if err == core.ErrNotFound {
|
||||||
|
w.WriteInt(0)
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
w.WriteError(cmd.Error(err))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
w.WriteInt(len(val))
|
||||||
|
return len(val), nil
|
||||||
|
}
|
71
internal/command/string/strlen_test.go
Normal file
71
internal/command/string/strlen_test.go
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
package string
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nalgeon/redka/internal/redis"
|
||||||
|
"github.com/nalgeon/redka/internal/testx"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStrlenParse(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
cmd string
|
||||||
|
want Strlen
|
||||||
|
err error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
cmd: "strlen",
|
||||||
|
want: Strlen{},
|
||||||
|
err: redis.ErrInvalidArgNum,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
cmd: "strlen name",
|
||||||
|
want: Strlen{key: "name"},
|
||||||
|
err: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
cmd: "strlen name age",
|
||||||
|
want: Strlen{},
|
||||||
|
err: redis.ErrInvalidArgNum,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.cmd, func(t *testing.T) {
|
||||||
|
cmd, err := redis.Parse(ParseStrlen, test.cmd)
|
||||||
|
testx.AssertEqual(t, err, test.err)
|
||||||
|
if err == nil {
|
||||||
|
testx.AssertEqual(t, cmd.key, test.want.key)
|
||||||
|
} else {
|
||||||
|
testx.AssertEqual(t, cmd, test.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStrlenExec(t *testing.T) {
|
||||||
|
t.Run("strlen", func(t *testing.T) {
|
||||||
|
db, red := getDB(t)
|
||||||
|
defer db.Close()
|
||||||
|
_ = db.Str().Set("name", "alice")
|
||||||
|
|
||||||
|
cmd := redis.MustParse(ParseStrlen, "strlen name")
|
||||||
|
conn := redis.NewFakeConn()
|
||||||
|
res, err := cmd.Run(conn, red)
|
||||||
|
testx.AssertNoErr(t, err)
|
||||||
|
testx.AssertEqual(t, res, 5)
|
||||||
|
testx.AssertEqual(t, conn.Out(), "5")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("key not found", func(t *testing.T) {
|
||||||
|
db, red := getDB(t)
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
cmd := redis.MustParse(ParseStrlen, "strlen name")
|
||||||
|
conn := redis.NewFakeConn()
|
||||||
|
res, err := cmd.Run(conn, red)
|
||||||
|
testx.AssertNoErr(t, err)
|
||||||
|
testx.AssertEqual(t, res, 0)
|
||||||
|
testx.AssertEqual(t, conn.Out(), "0")
|
||||||
|
})
|
||||||
|
}
|
Reference in New Issue
Block a user