fix: command - always return non-nil command when parsing (fix #27)

To avoid panic when calling pcmd.Error in handlers.parse.
This commit is contained in:
Anton
2024-06-09 00:11:47 +05:00
parent ce62018609
commit 2e507f8319
178 changed files with 559 additions and 377 deletions

View File

@@ -15,18 +15,18 @@ type Echo struct {
parts []string parts []string
} }
func ParseEcho(b redis.BaseCmd) (*Echo, error) { func ParseEcho(b redis.BaseCmd) (Echo, error) {
cmd := &Echo{BaseCmd: b} cmd := Echo{BaseCmd: b}
err := parser.New( err := parser.New(
parser.Strings(&cmd.parts), parser.Strings(&cmd.parts),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return Echo{}, err
} }
return cmd, nil return cmd, nil
} }
func (c *Echo) Run(w redis.Writer, _ redis.Redka) (any, error) { func (c Echo) Run(w redis.Writer, _ redis.Redka) (any, error) {
out := strings.Join(c.parts, " ") out := strings.Join(c.parts, " ")
w.WriteAny(out) w.WriteAny(out)
return out, nil return out, nil

View File

@@ -37,6 +37,8 @@ func TestEchoParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.parts, test.want) testx.AssertEqual(t, cmd.parts, test.want)
} else {
testx.AssertEqual(t, cmd, Echo{})
} }
}) })
} }

View File

@@ -16,18 +16,18 @@ type Ping struct {
message string message string
} }
func ParsePing(b redis.BaseCmd) (*Ping, error) { func ParsePing(b redis.BaseCmd) (Ping, error) {
cmd := &Ping{BaseCmd: b} cmd := Ping{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.message), parser.String(&cmd.message),
).Required(0).Run(cmd.Args()) ).Required(0).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return Ping{}, err
} }
return cmd, nil return cmd, nil
} }
func (c *Ping) Run(w redis.Writer, _ redis.Redka) (any, error) { func (c Ping) Run(w redis.Writer, _ redis.Redka) (any, error) {
if c.message == "" { if c.message == "" {
w.WriteAny(PONG) w.WriteAny(PONG)
return PONG, nil return PONG, nil

View File

@@ -36,6 +36,8 @@ func TestPingParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.message, test.want) testx.AssertEqual(t, cmd.message, test.want)
} else {
testx.AssertEqual(t, cmd, Ping{})
} }
}) })
} }

View File

@@ -15,19 +15,19 @@ type HDel struct {
fields []string fields []string
} }
func ParseHDel(b redis.BaseCmd) (*HDel, error) { func ParseHDel(b redis.BaseCmd) (HDel, error) {
cmd := &HDel{BaseCmd: b} cmd := HDel{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Strings(&cmd.fields), parser.Strings(&cmd.fields),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return HDel{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *HDel) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HDel) Run(w redis.Writer, red redis.Redka) (any, error) {
count, err := red.Hash().Delete(cmd.key, cmd.fields...) count, err := red.Hash().Delete(cmd.key, cmd.fields...)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -48,6 +48,8 @@ func TestHDelParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.fields, test.fields) testx.AssertEqual(t, cmd.fields, test.fields)
} else {
testx.AssertEqual(t, cmd, HDel{})
} }
}) })
} }

View File

@@ -11,17 +11,17 @@ type HExists struct {
field string field string
} }
func ParseHExists(b redis.BaseCmd) (*HExists, error) { func ParseHExists(b redis.BaseCmd) (HExists, error) {
cmd := &HExists{BaseCmd: b} cmd := HExists{BaseCmd: b}
if len(cmd.Args()) != 2 { if len(cmd.Args()) != 2 {
return cmd, redis.ErrInvalidArgNum return HExists{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
cmd.field = string(cmd.Args()[1]) cmd.field = string(cmd.Args()[1])
return cmd, nil return cmd, nil
} }
func (cmd *HExists) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HExists) Run(w redis.Writer, red redis.Redka) (any, error) {
ok, err := red.Hash().Exists(cmd.key, cmd.field) ok, err := red.Hash().Exists(cmd.key, cmd.field)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -47,6 +47,8 @@ func TestHExistsParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.field, test.field) testx.AssertEqual(t, cmd.field, test.field)
} else {
testx.AssertEqual(t, cmd, HExists{})
} }
}) })
} }

View File

@@ -14,17 +14,17 @@ type HGet struct {
field string field string
} }
func ParseHGet(b redis.BaseCmd) (*HGet, error) { func ParseHGet(b redis.BaseCmd) (HGet, error) {
cmd := &HGet{BaseCmd: b} cmd := HGet{BaseCmd: b}
if len(cmd.Args()) != 2 { if len(cmd.Args()) != 2 {
return cmd, redis.ErrInvalidArgNum return HGet{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
cmd.field = string(cmd.Args()[1]) cmd.field = string(cmd.Args()[1])
return cmd, nil return cmd, nil
} }
func (cmd *HGet) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HGet) Run(w redis.Writer, red redis.Redka) (any, error) {
val, err := red.Hash().Get(cmd.key, cmd.field) val, err := red.Hash().Get(cmd.key, cmd.field)
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteNull() w.WriteNull()

View File

@@ -48,6 +48,8 @@ func TestHGetParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.field, test.field) testx.AssertEqual(t, cmd.field, test.field)
} else {
testx.AssertEqual(t, cmd, HGet{})
} }
}) })
} }

View File

@@ -10,16 +10,16 @@ type HGetAll struct {
key string key string
} }
func ParseHGetAll(b redis.BaseCmd) (*HGetAll, error) { func ParseHGetAll(b redis.BaseCmd) (HGetAll, error) {
cmd := &HGetAll{BaseCmd: b} cmd := HGetAll{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return HGetAll{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *HGetAll) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HGetAll) Run(w redis.Writer, red redis.Redka) (any, error) {
items, err := red.Hash().Items(cmd.key) items, err := red.Hash().Items(cmd.key)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -37,6 +37,8 @@ func TestHGetAllParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
} else {
testx.AssertEqual(t, cmd, HGetAll{})
} }
}) })
} }

View File

@@ -16,20 +16,20 @@ type HIncrBy struct {
delta int delta int
} }
func ParseHIncrBy(b redis.BaseCmd) (*HIncrBy, error) { func ParseHIncrBy(b redis.BaseCmd) (HIncrBy, error) {
cmd := &HIncrBy{BaseCmd: b} cmd := HIncrBy{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.String(&cmd.field), parser.String(&cmd.field),
parser.Int(&cmd.delta), parser.Int(&cmd.delta),
).Required(3).Run(cmd.Args()) ).Required(3).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return HIncrBy{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *HIncrBy) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HIncrBy) Run(w redis.Writer, red redis.Redka) (any, error) {
val, err := red.Hash().Incr(cmd.key, cmd.field, cmd.delta) val, err := red.Hash().Incr(cmd.key, cmd.field, cmd.delta)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -51,6 +51,8 @@ func TestHIncrByParse(t *testing.T) {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.field, test.field) testx.AssertEqual(t, cmd.field, test.field)
testx.AssertEqual(t, cmd.delta, test.delta) testx.AssertEqual(t, cmd.delta, test.delta)
} else {
testx.AssertEqual(t, cmd, HIncrBy{})
} }
}) })
} }

View File

@@ -16,20 +16,20 @@ type HIncrByFloat struct {
delta float64 delta float64
} }
func ParseHIncrByFloat(b redis.BaseCmd) (*HIncrByFloat, error) { func ParseHIncrByFloat(b redis.BaseCmd) (HIncrByFloat, error) {
cmd := &HIncrByFloat{BaseCmd: b} cmd := HIncrByFloat{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.String(&cmd.field), parser.String(&cmd.field),
parser.Float(&cmd.delta), parser.Float(&cmd.delta),
).Required(3).Run(cmd.Args()) ).Required(3).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return HIncrByFloat{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *HIncrByFloat) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HIncrByFloat) Run(w redis.Writer, red redis.Redka) (any, error) {
val, err := red.Hash().IncrFloat(cmd.key, cmd.field, cmd.delta) val, err := red.Hash().IncrFloat(cmd.key, cmd.field, cmd.delta)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -51,6 +51,8 @@ func TestHIncrByFloatParse(t *testing.T) {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.field, test.field) testx.AssertEqual(t, cmd.field, test.field)
testx.AssertEqual(t, cmd.delta, test.delta) testx.AssertEqual(t, cmd.delta, test.delta)
} else {
testx.AssertEqual(t, cmd, HIncrByFloat{})
} }
}) })
} }

View File

@@ -10,16 +10,16 @@ type HKeys struct {
key string key string
} }
func ParseHKeys(b redis.BaseCmd) (*HKeys, error) { func ParseHKeys(b redis.BaseCmd) (HKeys, error) {
cmd := &HKeys{BaseCmd: b} cmd := HKeys{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return HKeys{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *HKeys) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HKeys) Run(w redis.Writer, red redis.Redka) (any, error) {
fields, err := red.Hash().Fields(cmd.key) fields, err := red.Hash().Fields(cmd.key)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -36,6 +36,8 @@ func TestHKeysParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
} else {
testx.AssertEqual(t, cmd, HKeys{})
} }
}) })
} }

View File

@@ -10,16 +10,16 @@ type HLen struct {
key string key string
} }
func ParseHLen(b redis.BaseCmd) (*HLen, error) { func ParseHLen(b redis.BaseCmd) (HLen, error) {
cmd := &HLen{BaseCmd: b} cmd := HLen{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return HLen{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *HLen) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HLen) Run(w redis.Writer, red redis.Redka) (any, error) {
count, err := red.Hash().Len(cmd.key) count, err := red.Hash().Len(cmd.key)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -36,6 +36,8 @@ func TestHLenParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
} else {
testx.AssertEqual(t, cmd, HLen{})
} }
}) })
} }

View File

@@ -15,19 +15,19 @@ type HMGet struct {
fields []string fields []string
} }
func ParseHMGet(b redis.BaseCmd) (*HMGet, error) { func ParseHMGet(b redis.BaseCmd) (HMGet, error) {
cmd := &HMGet{BaseCmd: b} cmd := HMGet{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Strings(&cmd.fields), parser.Strings(&cmd.fields),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return HMGet{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *HMGet) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HMGet) Run(w redis.Writer, red redis.Redka) (any, error) {
// Get the field-value map for requested fields. // Get the field-value map for requested fields.
items, err := red.Hash().GetMany(cmd.key, cmd.fields...) items, err := red.Hash().GetMany(cmd.key, cmd.fields...)
if err != nil { if err != nil {

View File

@@ -48,6 +48,8 @@ func TestHMGetParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.fields, test.fields) testx.AssertEqual(t, cmd.fields, test.fields)
} else {
testx.AssertEqual(t, cmd, HMGet{})
} }
}) })
} }

View File

@@ -14,19 +14,19 @@ type HMSet struct {
items map[string]any items map[string]any
} }
func ParseHMSet(b redis.BaseCmd) (*HMSet, error) { func ParseHMSet(b redis.BaseCmd) (HMSet, error) {
cmd := &HMSet{BaseCmd: b} cmd := HMSet{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.AnyMap(&cmd.items), parser.AnyMap(&cmd.items),
).Required(3).Run(cmd.Args()) ).Required(3).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return HMSet{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *HMSet) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HMSet) Run(w redis.Writer, red redis.Redka) (any, error) {
count, err := red.Hash().SetMany(cmd.key, cmd.items) count, err := red.Hash().SetMany(cmd.key, cmd.items)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -55,6 +55,8 @@ func TestHMSetParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.items, test.want.items) testx.AssertEqual(t, cmd.items, test.want.items)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -16,8 +16,8 @@ type HScan struct {
count int count int
} }
func ParseHScan(b redis.BaseCmd) (*HScan, error) { func ParseHScan(b redis.BaseCmd) (HScan, error) {
cmd := &HScan{BaseCmd: b} cmd := HScan{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
@@ -26,7 +26,7 @@ func ParseHScan(b redis.BaseCmd) (*HScan, error) {
parser.Named("count", parser.Int(&cmd.count)), parser.Named("count", parser.Int(&cmd.count)),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return HScan{}, err
} }
// all keys by default // all keys by default
@@ -37,7 +37,7 @@ func ParseHScan(b redis.BaseCmd) (*HScan, error) {
return cmd, nil return cmd, nil
} }
func (cmd *HScan) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HScan) Run(w redis.Writer, red redis.Redka) (any, error) {
res, err := red.Hash().Scan(cmd.key, cmd.cursor, cmd.match, cmd.count) res, err := red.Hash().Scan(cmd.key, cmd.cursor, cmd.match, cmd.count)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -109,6 +109,8 @@ func TestHScanParse(t *testing.T) {
testx.AssertEqual(t, cmd.cursor, test.cursor) testx.AssertEqual(t, cmd.cursor, test.cursor)
testx.AssertEqual(t, cmd.match, test.match) testx.AssertEqual(t, cmd.match, test.match)
testx.AssertEqual(t, cmd.count, test.count) testx.AssertEqual(t, cmd.count, test.count)
} else {
testx.AssertEqual(t, cmd, HScan{})
} }
}) })
} }

View File

@@ -14,19 +14,19 @@ type HSet struct {
items map[string]any items map[string]any
} }
func ParseHSet(b redis.BaseCmd) (*HSet, error) { func ParseHSet(b redis.BaseCmd) (HSet, error) {
cmd := &HSet{BaseCmd: b} cmd := HSet{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.AnyMap(&cmd.items), parser.AnyMap(&cmd.items),
).Required(3).Run(cmd.Args()) ).Required(3).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return HSet{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *HSet) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HSet) Run(w redis.Writer, red redis.Redka) (any, error) {
count, err := red.Hash().SetMany(cmd.key, cmd.items) count, err := red.Hash().SetMany(cmd.key, cmd.items)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -55,6 +55,8 @@ func TestHSetParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.items, test.want.items) testx.AssertEqual(t, cmd.items, test.want.items)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -12,10 +12,10 @@ type HSetNX struct {
value []byte value []byte
} }
func ParseHSetNX(b redis.BaseCmd) (*HSetNX, error) { func ParseHSetNX(b redis.BaseCmd) (HSetNX, error) {
cmd := &HSetNX{BaseCmd: b} cmd := HSetNX{BaseCmd: b}
if len(cmd.Args()) != 3 { if len(cmd.Args()) != 3 {
return cmd, redis.ErrInvalidArgNum return HSetNX{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
cmd.field = string(cmd.Args()[1]) cmd.field = string(cmd.Args()[1])
@@ -23,7 +23,7 @@ func ParseHSetNX(b redis.BaseCmd) (*HSetNX, error) {
return cmd, nil return cmd, nil
} }
func (cmd *HSetNX) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HSetNX) Run(w redis.Writer, red redis.Redka) (any, error) {
ok, err := red.Hash().SetNotExists(cmd.key, cmd.field, cmd.value) ok, err := red.Hash().SetNotExists(cmd.key, cmd.field, cmd.value)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -47,6 +47,8 @@ func TestHSetNXParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.value, test.want.value) testx.AssertEqual(t, cmd.value, test.want.value)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -10,16 +10,16 @@ type HVals struct {
key string key string
} }
func ParseHVals(b redis.BaseCmd) (*HVals, error) { func ParseHVals(b redis.BaseCmd) (HVals, error) {
cmd := &HVals{BaseCmd: b} cmd := HVals{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return HVals{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *HVals) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd HVals) Run(w redis.Writer, red redis.Redka) (any, error) {
vals, err := red.Hash().Values(cmd.key) vals, err := red.Hash().Values(cmd.key)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -37,6 +37,8 @@ func TestHValsParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
} else {
testx.AssertEqual(t, cmd, HVals{})
} }
}) })
} }

View File

@@ -13,18 +13,18 @@ type Del struct {
keys []string keys []string
} }
func ParseDel(b redis.BaseCmd) (*Del, error) { func ParseDel(b redis.BaseCmd) (Del, error) {
cmd := &Del{BaseCmd: b} cmd := Del{BaseCmd: b}
err := parser.New( err := parser.New(
parser.Strings(&cmd.keys), parser.Strings(&cmd.keys),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return Del{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *Del) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd Del) Run(w redis.Writer, red redis.Redka) (any, error) {
count, err := red.Key().Delete(cmd.keys...) count, err := red.Key().Delete(cmd.keys...)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -37,6 +37,8 @@ func TestDelParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.keys, test.want) testx.AssertEqual(t, cmd.keys, test.want)
} else {
testx.AssertEqual(t, cmd, Del{})
} }
}) })
} }

View File

@@ -13,18 +13,18 @@ type Exists struct {
keys []string keys []string
} }
func ParseExists(b redis.BaseCmd) (*Exists, error) { func ParseExists(b redis.BaseCmd) (Exists, error) {
cmd := &Exists{BaseCmd: b} cmd := Exists{BaseCmd: b}
err := parser.New( err := parser.New(
parser.Strings(&cmd.keys), parser.Strings(&cmd.keys),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return Exists{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *Exists) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd Exists) Run(w redis.Writer, red redis.Redka) (any, error) {
count, err := red.Key().Count(cmd.keys...) count, err := red.Key().Count(cmd.keys...)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -36,6 +36,8 @@ func TestExistsParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.keys, test.want) testx.AssertEqual(t, cmd.keys, test.want)
} else {
testx.AssertEqual(t, cmd, Exists{})
} }
}) })
} }

View File

@@ -17,8 +17,8 @@ type Expire struct {
ttl time.Duration ttl time.Duration
} }
func ParseExpire(b redis.BaseCmd, multi int) (*Expire, error) { func ParseExpire(b redis.BaseCmd, multi int) (Expire, error) {
cmd := &Expire{BaseCmd: b} cmd := Expire{BaseCmd: b}
var ttl int var ttl int
err := parser.New( err := parser.New(
@@ -26,14 +26,14 @@ func ParseExpire(b redis.BaseCmd, multi int) (*Expire, error) {
parser.Int(&ttl), parser.Int(&ttl),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return Expire{}, err
} }
cmd.ttl = time.Duration(multi*ttl) * time.Millisecond cmd.ttl = time.Duration(multi*ttl) * time.Millisecond
return cmd, nil return cmd, nil
} }
func (cmd *Expire) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd Expire) Run(w redis.Writer, red redis.Redka) (any, error) {
err := red.Key().Expire(cmd.key, cmd.ttl) err := red.Key().Expire(cmd.key, cmd.ttl)
if err != nil && err != core.ErrNotFound { if err != nil && err != core.ErrNotFound {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -47,7 +47,7 @@ func TestExpireParse(t *testing.T) {
}, },
} }
parse := func(b redis.BaseCmd) (*Expire, error) { parse := func(b redis.BaseCmd) (Expire, error) {
return ParseExpire(b, 1000) return ParseExpire(b, 1000)
} }
@@ -58,13 +58,15 @@ func TestExpireParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.ttl, test.ttl) testx.AssertEqual(t, cmd.ttl, test.ttl)
} else {
testx.AssertEqual(t, cmd, Expire{})
} }
}) })
} }
} }
func TestExpireExec(t *testing.T) { func TestExpireExec(t *testing.T) {
parse := func(b redis.BaseCmd) (*Expire, error) { parse := func(b redis.BaseCmd) (Expire, error) {
return ParseExpire(b, 1000) return ParseExpire(b, 1000)
} }
t.Run("create expire", func(t *testing.T) { t.Run("create expire", func(t *testing.T) {

View File

@@ -17,8 +17,8 @@ type ExpireAt struct {
at time.Time at time.Time
} }
func ParseExpireAt(b redis.BaseCmd, multi int) (*ExpireAt, error) { func ParseExpireAt(b redis.BaseCmd, multi int) (ExpireAt, error) {
cmd := &ExpireAt{BaseCmd: b} cmd := ExpireAt{BaseCmd: b}
var at int var at int
err := parser.New( err := parser.New(
@@ -26,14 +26,14 @@ func ParseExpireAt(b redis.BaseCmd, multi int) (*ExpireAt, error) {
parser.Int(&at), parser.Int(&at),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return ExpireAt{}, err
} }
cmd.at = time.UnixMilli(int64(multi * at)) cmd.at = time.UnixMilli(int64(multi * at))
return cmd, nil return cmd, nil
} }
func (cmd *ExpireAt) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd ExpireAt) Run(w redis.Writer, red redis.Redka) (any, error) {
err := red.Key().ExpireAt(cmd.key, cmd.at) err := red.Key().ExpireAt(cmd.key, cmd.at)
if err != nil && err != core.ErrNotFound { if err != nil && err != core.ErrNotFound {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -48,7 +48,7 @@ func TestExpireAtParse(t *testing.T) {
}, },
} }
parse := func(b redis.BaseCmd) (*ExpireAt, error) { parse := func(b redis.BaseCmd) (ExpireAt, error) {
return ParseExpireAt(b, 1000) return ParseExpireAt(b, 1000)
} }
@@ -59,13 +59,15 @@ func TestExpireAtParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.at.Unix(), test.at.Unix()) testx.AssertEqual(t, cmd.at.Unix(), test.at.Unix())
} else {
testx.AssertEqual(t, cmd, ExpireAt{})
} }
}) })
} }
} }
func TestExpireAtExec(t *testing.T) { func TestExpireAtExec(t *testing.T) {
parse := func(b redis.BaseCmd) (*ExpireAt, error) { parse := func(b redis.BaseCmd) (ExpireAt, error) {
return ParseExpireAt(b, 1000) return ParseExpireAt(b, 1000)
} }
t.Run("create expireat", func(t *testing.T) { t.Run("create expireat", func(t *testing.T) {

View File

@@ -9,15 +9,15 @@ type FlushDB struct {
redis.BaseCmd redis.BaseCmd
} }
func ParseFlushDB(b redis.BaseCmd) (*FlushDB, error) { func ParseFlushDB(b redis.BaseCmd) (FlushDB, error) {
cmd := &FlushDB{BaseCmd: b} cmd := FlushDB{BaseCmd: b}
if len(cmd.Args()) != 0 { if len(cmd.Args()) != 0 {
return cmd, redis.ErrSyntaxError return FlushDB{}, redis.ErrSyntaxError
} }
return cmd, nil return cmd, nil
} }
func (cmd *FlushDB) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd FlushDB) Run(w redis.Writer, red redis.Redka) (any, error) {
err := red.Key().DeleteAll() err := red.Key().DeleteAll()
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -28,8 +28,11 @@ func TestFlushDBParse(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.cmd, func(t *testing.T) { t.Run(test.cmd, func(t *testing.T) {
_, err := redis.Parse(ParseFlushDB, test.cmd) cmd, err := redis.Parse(ParseFlushDB, test.cmd)
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err != nil {
testx.AssertEqual(t, cmd, FlushDB{})
}
}) })
} }
} }

View File

@@ -10,16 +10,16 @@ type Keys struct {
pattern string pattern string
} }
func ParseKeys(b redis.BaseCmd) (*Keys, error) { func ParseKeys(b redis.BaseCmd) (Keys, error) {
cmd := &Keys{BaseCmd: b} cmd := Keys{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return Keys{}, redis.ErrInvalidArgNum
} }
cmd.pattern = string(cmd.Args()[0]) cmd.pattern = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *Keys) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd Keys) Run(w redis.Writer, red redis.Redka) (any, error) {
keys, err := red.Key().Keys(cmd.pattern) keys, err := red.Key().Keys(cmd.pattern)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -42,6 +42,8 @@ func TestKeysParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.pattern, test.want) testx.AssertEqual(t, cmd.pattern, test.want)
} else {
testx.AssertEqual(t, cmd, Keys{})
} }
}) })
} }

View File

@@ -13,16 +13,16 @@ type Persist struct {
key string key string
} }
func ParsePersist(b redis.BaseCmd) (*Persist, error) { func ParsePersist(b redis.BaseCmd) (Persist, error) {
cmd := &Persist{BaseCmd: b} cmd := Persist{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return Persist{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *Persist) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd Persist) Run(w redis.Writer, red redis.Redka) (any, error) {
err := red.Key().Persist(cmd.key) err := red.Key().Persist(cmd.key)
if err != nil && err != core.ErrNotFound { if err != nil && err != core.ErrNotFound {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -37,6 +37,8 @@ func TestPersistParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
} else {
testx.AssertEqual(t, cmd, Persist{})
} }
}) })
} }

View File

@@ -47,7 +47,7 @@ func TestPExpireParse(t *testing.T) {
}, },
} }
parse := func(b redis.BaseCmd) (*Expire, error) { parse := func(b redis.BaseCmd) (Expire, error) {
return ParseExpire(b, 1) return ParseExpire(b, 1)
} }
@@ -58,13 +58,15 @@ func TestPExpireParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.ttl, test.ttl) testx.AssertEqual(t, cmd.ttl, test.ttl)
} else {
testx.AssertEqual(t, cmd, Expire{})
} }
}) })
} }
} }
func TestPExpireExec(t *testing.T) { func TestPExpireExec(t *testing.T) {
parse := func(b redis.BaseCmd) (*Expire, error) { parse := func(b redis.BaseCmd) (Expire, error) {
return ParseExpire(b, 1) return ParseExpire(b, 1)
} }

View File

@@ -12,15 +12,15 @@ type RandomKey struct {
redis.BaseCmd redis.BaseCmd
} }
func ParseRandomKey(b redis.BaseCmd) (*RandomKey, error) { func ParseRandomKey(b redis.BaseCmd) (RandomKey, error) {
cmd := &RandomKey{BaseCmd: b} cmd := RandomKey{BaseCmd: b}
if len(cmd.Args()) != 0 { if len(cmd.Args()) != 0 {
return cmd, redis.ErrInvalidArgNum return RandomKey{}, redis.ErrInvalidArgNum
} }
return cmd, nil return cmd, nil
} }
func (cmd *RandomKey) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd RandomKey) Run(w redis.Writer, red redis.Redka) (any, error) {
key, err := red.Key().Random() key, err := red.Key().Random()
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteNull() w.WriteNull()

View File

@@ -30,8 +30,11 @@ func TestRandomKeyParse(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.cmd, func(t *testing.T) { t.Run(test.cmd, func(t *testing.T) {
_, err := redis.Parse(ParseRandomKey, test.cmd) cmd, err := redis.Parse(ParseRandomKey, test.cmd)
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err != nil {
testx.AssertEqual(t, cmd, RandomKey{})
}
}) })
} }
} }

View File

@@ -11,17 +11,17 @@ type Rename struct {
newKey string newKey string
} }
func ParseRename(b redis.BaseCmd) (*Rename, error) { func ParseRename(b redis.BaseCmd) (Rename, error) {
cmd := &Rename{BaseCmd: b} cmd := Rename{BaseCmd: b}
if len(cmd.Args()) != 2 { if len(cmd.Args()) != 2 {
return cmd, redis.ErrInvalidArgNum return Rename{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
cmd.newKey = string(cmd.Args()[1]) cmd.newKey = string(cmd.Args()[1])
return cmd, nil return cmd, nil
} }
func (cmd *Rename) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd Rename) Run(w redis.Writer, red redis.Redka) (any, error) {
err := red.Key().Rename(cmd.key, cmd.newKey) err := red.Key().Rename(cmd.key, cmd.newKey)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -42,6 +42,8 @@ func TestRenameParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.newKey, test.newKey) testx.AssertEqual(t, cmd.newKey, test.newKey)
} else {
testx.AssertEqual(t, cmd, Rename{})
} }
}) })
} }

View File

@@ -11,17 +11,17 @@ type RenameNX struct {
newKey string newKey string
} }
func ParseRenameNX(b redis.BaseCmd) (*RenameNX, error) { func ParseRenameNX(b redis.BaseCmd) (RenameNX, error) {
cmd := &RenameNX{BaseCmd: b} cmd := RenameNX{BaseCmd: b}
if len(cmd.Args()) != 2 { if len(cmd.Args()) != 2 {
return cmd, redis.ErrInvalidArgNum return RenameNX{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
cmd.newKey = string(cmd.Args()[1]) cmd.newKey = string(cmd.Args()[1])
return cmd, nil return cmd, nil
} }
func (cmd *RenameNX) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd RenameNX) Run(w redis.Writer, red redis.Redka) (any, error) {
ok, err := red.Key().RenameNotExists(cmd.key, cmd.newKey) ok, err := red.Key().RenameNotExists(cmd.key, cmd.newKey)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -42,6 +42,8 @@ func TestRenameNXParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
testx.AssertEqual(t, cmd.newKey, test.newKey) testx.AssertEqual(t, cmd.newKey, test.newKey)
} else {
testx.AssertEqual(t, cmd, RenameNX{})
} }
}) })
} }

View File

@@ -25,8 +25,8 @@ type Scan struct {
ktype string ktype string
} }
func ParseScan(b redis.BaseCmd) (*Scan, error) { func ParseScan(b redis.BaseCmd) (Scan, error) {
cmd := &Scan{BaseCmd: b} cmd := Scan{BaseCmd: b}
err := parser.New( err := parser.New(
parser.Int(&cmd.cursor), parser.Int(&cmd.cursor),
@@ -36,7 +36,7 @@ func ParseScan(b redis.BaseCmd) (*Scan, error) {
TypeHash, TypeList, TypeSet, TypeString, TypeZSet)), TypeHash, TypeList, TypeSet, TypeString, TypeZSet)),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return Scan{}, err
} }
// all keys by default // all keys by default
@@ -47,7 +47,7 @@ func ParseScan(b redis.BaseCmd) (*Scan, error) {
return cmd, nil return cmd, nil
} }
func (cmd *Scan) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd Scan) Run(w redis.Writer, red redis.Redka) (any, error) {
res, err := red.Key().Scan(cmd.cursor, cmd.match, toTypeID(cmd.ktype), cmd.count) res, err := red.Key().Scan(cmd.cursor, cmd.match, toTypeID(cmd.ktype), cmd.count)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -114,6 +114,8 @@ func TestScanParse(t *testing.T) {
testx.AssertEqual(t, cmd.match, test.match) testx.AssertEqual(t, cmd.match, test.match)
testx.AssertEqual(t, cmd.ktype, test.ktype) testx.AssertEqual(t, cmd.ktype, test.ktype)
testx.AssertEqual(t, cmd.count, test.count) testx.AssertEqual(t, cmd.count, test.count)
} else {
testx.AssertEqual(t, cmd, Scan{})
} }
}) })
} }

View File

@@ -15,16 +15,16 @@ type TTL struct {
key string key string
} }
func ParseTTL(b redis.BaseCmd) (*TTL, error) { func ParseTTL(b redis.BaseCmd) (TTL, error) {
cmd := &TTL{BaseCmd: b} cmd := TTL{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return TTL{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *TTL) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd TTL) Run(w redis.Writer, red redis.Redka) (any, error) {
k, err := red.Key().Get(cmd.key) k, err := red.Key().Get(cmd.key)
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteInt(-2) w.WriteInt(-2)

View File

@@ -37,6 +37,8 @@ func TestTTLParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
} else {
testx.AssertEqual(t, cmd, TTL{})
} }
}) })
} }

View File

@@ -13,16 +13,16 @@ type Type struct {
key string key string
} }
func ParseType(b redis.BaseCmd) (*Type, error) { func ParseType(b redis.BaseCmd) (Type, error) {
cmd := &Type{BaseCmd: b} cmd := Type{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return Type{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *Type) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd Type) Run(w redis.Writer, red redis.Redka) (any, error) {
k, err := red.Key().Get(cmd.key) k, err := red.Key().Get(cmd.key)
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteString("none") w.WriteString("none")

View File

@@ -36,6 +36,8 @@ func TestTypeParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.key) testx.AssertEqual(t, cmd.key, test.key)
} else {
testx.AssertEqual(t, cmd, Type{})
} }
}) })
} }

View File

@@ -15,19 +15,19 @@ type LIndex struct {
index int index int
} }
func ParseLIndex(b redis.BaseCmd) (*LIndex, error) { func ParseLIndex(b redis.BaseCmd) (LIndex, error) {
cmd := &LIndex{BaseCmd: b} cmd := LIndex{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Int(&cmd.index), parser.Int(&cmd.index),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LIndex{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LIndex) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LIndex) Run(w redis.Writer, red redis.Redka) (any, error) {
val, err := red.List().Get(cmd.key, cmd.index) val, err := red.List().Get(cmd.key, cmd.index)
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteNull() w.WriteNull()

View File

@@ -43,6 +43,8 @@ func TestLIndexParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.index, test.want.index) testx.AssertEqual(t, cmd.index, test.want.index)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -22,8 +22,8 @@ type LInsert struct {
elem []byte elem []byte
} }
func ParseLInsert(b redis.BaseCmd) (*LInsert, error) { func ParseLInsert(b redis.BaseCmd) (LInsert, error) {
cmd := &LInsert{BaseCmd: b} cmd := LInsert{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Enum(&cmd.where, Before, After), parser.Enum(&cmd.where, Before, After),
@@ -31,12 +31,12 @@ func ParseLInsert(b redis.BaseCmd) (*LInsert, error) {
parser.Bytes(&cmd.elem), parser.Bytes(&cmd.elem),
).Required(4).Run(cmd.Args()) ).Required(4).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LInsert{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LInsert) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LInsert) Run(w redis.Writer, red redis.Redka) (any, error) {
var n int var n int
var err error var err error
if cmd.where == Before { if cmd.where == Before {

View File

@@ -61,6 +61,8 @@ func TestLInsertParse(t *testing.T) {
testx.AssertEqual(t, cmd.where, test.want.where) testx.AssertEqual(t, cmd.where, test.want.where)
testx.AssertEqual(t, cmd.pivot, test.want.pivot) testx.AssertEqual(t, cmd.pivot, test.want.pivot)
testx.AssertEqual(t, cmd.elem, test.want.elem) testx.AssertEqual(t, cmd.elem, test.want.elem)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -13,18 +13,18 @@ type LLen struct {
key string key string
} }
func ParseLLen(b redis.BaseCmd) (*LLen, error) { func ParseLLen(b redis.BaseCmd) (LLen, error) {
cmd := &LLen{BaseCmd: b} cmd := LLen{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LLen{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LLen) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LLen) Run(w redis.Writer, red redis.Redka) (any, error) {
n, err := red.List().Len(cmd.key) n, err := red.List().Len(cmd.key)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -36,6 +36,8 @@ func TestLLenParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -14,18 +14,18 @@ type LPop struct {
key string key string
} }
func ParseLPop(b redis.BaseCmd) (*LPop, error) { func ParseLPop(b redis.BaseCmd) (LPop, error) {
cmd := &LPop{BaseCmd: b} cmd := LPop{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LPop{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LPop) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LPop) Run(w redis.Writer, red redis.Redka) (any, error) {
val, err := red.List().PopFront(cmd.key) val, err := red.List().PopFront(cmd.key)
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteNull() w.WriteNull()

View File

@@ -37,6 +37,8 @@ func TestLPopParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -15,19 +15,19 @@ type LPush struct {
elem []byte elem []byte
} }
func ParseLPush(b redis.BaseCmd) (*LPush, error) { func ParseLPush(b redis.BaseCmd) (LPush, error) {
cmd := &LPush{BaseCmd: b} cmd := LPush{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Bytes(&cmd.elem), parser.Bytes(&cmd.elem),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LPush{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LPush) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LPush) Run(w redis.Writer, red redis.Redka) (any, error) {
n, err := red.List().PushFront(cmd.key, cmd.elem) n, err := red.List().PushFront(cmd.key, cmd.elem)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -15,20 +15,20 @@ type LRange struct {
stop int stop int
} }
func ParseLRange(b redis.BaseCmd) (*LRange, error) { func ParseLRange(b redis.BaseCmd) (LRange, error) {
cmd := &LRange{BaseCmd: b} cmd := LRange{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Int(&cmd.start), parser.Int(&cmd.start),
parser.Int(&cmd.stop), parser.Int(&cmd.stop),
).Required(3).Run(cmd.Args()) ).Required(3).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LRange{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LRange) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LRange) Run(w redis.Writer, red redis.Redka) (any, error) {
vals, err := red.List().Range(cmd.key, cmd.start, cmd.stop) vals, err := red.List().Range(cmd.key, cmd.start, cmd.stop)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -44,6 +44,8 @@ func TestLRangeParse(t *testing.T) {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.start, test.want.start) testx.AssertEqual(t, cmd.start, test.want.start)
testx.AssertEqual(t, cmd.stop, test.want.stop) testx.AssertEqual(t, cmd.stop, test.want.stop)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -15,20 +15,20 @@ type LRem struct {
elem []byte elem []byte
} }
func ParseLRem(b redis.BaseCmd) (*LRem, error) { func ParseLRem(b redis.BaseCmd) (LRem, error) {
cmd := &LRem{BaseCmd: b} cmd := LRem{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Int(&cmd.count), parser.Int(&cmd.count),
parser.Bytes(&cmd.elem), parser.Bytes(&cmd.elem),
).Required(3).Run(cmd.Args()) ).Required(3).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LRem{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LRem) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LRem) Run(w redis.Writer, red redis.Redka) (any, error) {
var n int var n int
var err error var err error
switch { switch {

View File

@@ -48,6 +48,8 @@ func TestLRemParse(t *testing.T) {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.count, test.want.count) testx.AssertEqual(t, cmd.count, test.want.count)
testx.AssertEqual(t, cmd.elem, test.want.elem) testx.AssertEqual(t, cmd.elem, test.want.elem)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -16,20 +16,20 @@ type LSet struct {
elem []byte elem []byte
} }
func ParseLSet(b redis.BaseCmd) (*LSet, error) { func ParseLSet(b redis.BaseCmd) (LSet, error) {
cmd := &LSet{BaseCmd: b} cmd := LSet{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Int(&cmd.index), parser.Int(&cmd.index),
parser.Bytes(&cmd.elem), parser.Bytes(&cmd.elem),
).Required(3).Run(cmd.Args()) ).Required(3).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LSet{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LSet) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LSet) Run(w redis.Writer, red redis.Redka) (any, error) {
err := red.List().Set(cmd.key, cmd.index, cmd.elem) err := red.List().Set(cmd.key, cmd.index, cmd.elem)
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteError(cmd.Error(redis.ErrOutOfRange)) w.WriteError(cmd.Error(redis.ErrOutOfRange))

View File

@@ -49,6 +49,8 @@ func TestLSetParse(t *testing.T) {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.index, test.want.index) testx.AssertEqual(t, cmd.index, test.want.index)
testx.AssertEqual(t, cmd.elem, test.want.elem) testx.AssertEqual(t, cmd.elem, test.want.elem)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -15,20 +15,20 @@ type LTrim struct {
stop int stop int
} }
func ParseLTrim(b redis.BaseCmd) (*LTrim, error) { func ParseLTrim(b redis.BaseCmd) (LTrim, error) {
cmd := &LTrim{BaseCmd: b} cmd := LTrim{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Int(&cmd.start), parser.Int(&cmd.start),
parser.Int(&cmd.stop), parser.Int(&cmd.stop),
).Required(3).Run(cmd.Args()) ).Required(3).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return LTrim{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *LTrim) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd LTrim) Run(w redis.Writer, red redis.Redka) (any, error) {
n, err := red.List().Trim(cmd.key, cmd.start, cmd.stop) n, err := red.List().Trim(cmd.key, cmd.start, cmd.stop)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -38,6 +38,8 @@ func TestLTrimParse(t *testing.T) {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.start, test.want.start) testx.AssertEqual(t, cmd.start, test.want.start)
testx.AssertEqual(t, cmd.stop, test.want.stop) testx.AssertEqual(t, cmd.stop, test.want.stop)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -14,18 +14,18 @@ type RPop struct {
key string key string
} }
func ParseRPop(b redis.BaseCmd) (*RPop, error) { func ParseRPop(b redis.BaseCmd) (RPop, error) {
cmd := &RPop{BaseCmd: b} cmd := RPop{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return RPop{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *RPop) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd RPop) Run(w redis.Writer, red redis.Redka) (any, error) {
val, err := red.List().PopBack(cmd.key) val, err := red.List().PopBack(cmd.key)
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteNull() w.WriteNull()

View File

@@ -37,6 +37,8 @@ func TestRPopParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -16,19 +16,19 @@ type RPopLPush struct {
dst string dst string
} }
func ParseRPopLPush(b redis.BaseCmd) (*RPopLPush, error) { func ParseRPopLPush(b redis.BaseCmd) (RPopLPush, error) {
cmd := &RPopLPush{BaseCmd: b} cmd := RPopLPush{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.src), parser.String(&cmd.src),
parser.String(&cmd.dst), parser.String(&cmd.dst),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return RPopLPush{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *RPopLPush) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd RPopLPush) Run(w redis.Writer, red redis.Redka) (any, error) {
val, err := red.List().PopBackPushFront(cmd.src, cmd.dst) val, err := red.List().PopBackPushFront(cmd.src, cmd.dst)
if err == core.ErrNotFound { if err == core.ErrNotFound {
w.WriteNull() w.WriteNull()

View File

@@ -38,6 +38,8 @@ func TestRPopLPushParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.src, test.want.src) testx.AssertEqual(t, cmd.src, test.want.src)
testx.AssertEqual(t, cmd.dst, test.want.dst) testx.AssertEqual(t, cmd.dst, test.want.dst)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -15,19 +15,19 @@ type RPush struct {
elem []byte elem []byte
} }
func ParseRPush(b redis.BaseCmd) (*RPush, error) { func ParseRPush(b redis.BaseCmd) (RPush, error) {
cmd := &RPush{BaseCmd: b} cmd := RPush{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Bytes(&cmd.elem), parser.Bytes(&cmd.elem),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return RPush{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *RPush) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd RPush) Run(w redis.Writer, red redis.Redka) (any, error) {
n, err := red.List().PushBack(cmd.key, cmd.elem) n, err := red.List().PushBack(cmd.key, cmd.elem)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -43,6 +43,8 @@ func TestRPushParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.elem, test.want.elem) testx.AssertEqual(t, cmd.elem, test.want.elem)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -9,15 +9,15 @@ type DBSize struct {
redis.BaseCmd redis.BaseCmd
} }
func ParseDBSize(b redis.BaseCmd) (*DBSize, error) { func ParseDBSize(b redis.BaseCmd) (DBSize, error) {
cmd := &DBSize{BaseCmd: b} cmd := DBSize{BaseCmd: b}
if len(cmd.Args()) != 0 { if len(cmd.Args()) != 0 {
return cmd, redis.ErrInvalidArgNum return DBSize{}, redis.ErrInvalidArgNum
} }
return cmd, nil return cmd, nil
} }
func (cmd *DBSize) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd DBSize) Run(w redis.Writer, red redis.Redka) (any, error) {
n, err := red.Key().Len() n, err := red.Key().Len()
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -24,8 +24,11 @@ func TestDBSizeParse(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.cmd, func(t *testing.T) { t.Run(test.cmd, func(t *testing.T) {
_, err := redis.Parse(ParseDBSize, test.cmd) cmd, err := redis.Parse(ParseDBSize, test.cmd)
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err != nil {
testx.AssertEqual(t, cmd, DBSize{})
}
}) })
} }
} }

View File

@@ -41,18 +41,18 @@ type Lolwut struct {
parts []string parts []string
} }
func ParseLolwut(b redis.BaseCmd) (*Lolwut, error) { func ParseLolwut(b redis.BaseCmd) (Lolwut, error) {
cmd := &Lolwut{BaseCmd: b} cmd := Lolwut{BaseCmd: b}
err := parser.New( err := parser.New(
parser.Strings(&cmd.parts), parser.Strings(&cmd.parts),
).Required(0).Run(cmd.Args()) ).Required(0).Run(cmd.Args())
if err != nil { if err != nil {
return cmd, err return Lolwut{}, err
} }
return cmd, nil return cmd, nil
} }
func (c *Lolwut) Run(w redis.Writer, _ redis.Redka) (any, error) { func (c Lolwut) Run(w redis.Writer, _ redis.Redka) (any, error) {
var answer string var answer string
if len(c.parts) != 0 { if len(c.parts) != 0 {
answer = lolwutAnswers[rand.Intn(len(lolwutAnswers))] answer = lolwutAnswers[rand.Intn(len(lolwutAnswers))]

View File

@@ -29,8 +29,11 @@ func TestLolwutParse(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.cmd, func(t *testing.T) { t.Run(test.cmd, func(t *testing.T) {
_, err := redis.Parse(ParseLolwut, test.cmd) cmd, err := redis.Parse(ParseLolwut, test.cmd)
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err != nil {
testx.AssertEqual(t, cmd, Lolwut{})
}
}) })
} }
} }

View File

@@ -7,11 +7,11 @@ type OK struct {
redis.BaseCmd redis.BaseCmd
} }
func ParseOK(b redis.BaseCmd) (*OK, error) { func ParseOK(b redis.BaseCmd) (OK, error) {
return &OK{BaseCmd: b}, nil return OK{BaseCmd: b}, nil
} }
func (c *OK) Run(w redis.Writer, _ redis.Redka) (any, error) { func (c OK) Run(w redis.Writer, _ redis.Redka) (any, error) {
w.WriteString("OK") w.WriteString("OK")
return true, nil return true, nil
} }

View File

@@ -8,11 +8,11 @@ type Unknown struct {
redis.BaseCmd redis.BaseCmd
} }
func ParseUnknown(b redis.BaseCmd) (*Unknown, error) { func ParseUnknown(b redis.BaseCmd) (Unknown, error) {
return &Unknown{BaseCmd: b}, nil return Unknown{BaseCmd: b}, nil
} }
func (cmd *Unknown) Run(w redis.Writer, _ redis.Redka) (any, error) { func (cmd Unknown) Run(w redis.Writer, _ redis.Redka) (any, error) {
err := redis.ErrUnknownCmd err := redis.ErrUnknownCmd
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))
return nil, err return nil, err

View File

@@ -15,19 +15,19 @@ type SAdd struct {
members []any members []any
} }
func ParseSAdd(b redis.BaseCmd) (*SAdd, error) { func ParseSAdd(b redis.BaseCmd) (SAdd, error) {
cmd := &SAdd{BaseCmd: b} cmd := SAdd{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Anys(&cmd.members), parser.Anys(&cmd.members),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return SAdd{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *SAdd) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd SAdd) Run(w redis.Writer, red redis.Redka) (any, error) {
count, err := red.Set().Add(cmd.key, cmd.members...) count, err := red.Set().Add(cmd.key, cmd.members...)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -48,6 +48,8 @@ func TestSAddParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
testx.AssertEqual(t, cmd.members, test.want.members) testx.AssertEqual(t, cmd.members, test.want.members)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -10,16 +10,16 @@ type SCard struct {
key string key string
} }
func ParseSCard(b redis.BaseCmd) (*SCard, error) { func ParseSCard(b redis.BaseCmd) (SCard, error) {
cmd := &SCard{BaseCmd: b} cmd := SCard{BaseCmd: b}
if len(cmd.Args()) != 1 { if len(cmd.Args()) != 1 {
return cmd, redis.ErrInvalidArgNum return SCard{}, redis.ErrInvalidArgNum
} }
cmd.key = string(cmd.Args()[0]) cmd.key = string(cmd.Args()[0])
return cmd, nil return cmd, nil
} }
func (cmd *SCard) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd SCard) Run(w redis.Writer, red redis.Redka) (any, error) {
n, err := red.Set().Len(cmd.key) n, err := red.Set().Len(cmd.key)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -36,6 +36,8 @@ func TestSCardParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.key, test.want.key) testx.AssertEqual(t, cmd.key, test.want.key)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -13,18 +13,18 @@ type SDiff struct {
keys []string keys []string
} }
func ParseSDiff(b redis.BaseCmd) (*SDiff, error) { func ParseSDiff(b redis.BaseCmd) (SDiff, error) {
cmd := &SDiff{BaseCmd: b} cmd := SDiff{BaseCmd: b}
err := parser.New( err := parser.New(
parser.Strings(&cmd.keys), parser.Strings(&cmd.keys),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return SDiff{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *SDiff) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd SDiff) Run(w redis.Writer, red redis.Redka) (any, error) {
elems, err := red.Set().Diff(cmd.keys...) elems, err := red.Set().Diff(cmd.keys...)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -37,6 +37,8 @@ func TestSDiffParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.keys, test.want.keys) testx.AssertEqual(t, cmd.keys, test.want.keys)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -14,19 +14,19 @@ type SDiffStore struct {
keys []string keys []string
} }
func ParseSDiffStore(b redis.BaseCmd) (*SDiffStore, error) { func ParseSDiffStore(b redis.BaseCmd) (SDiffStore, error) {
cmd := &SDiffStore{BaseCmd: b} cmd := SDiffStore{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.dest), parser.String(&cmd.dest),
parser.Strings(&cmd.keys), parser.Strings(&cmd.keys),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return SDiffStore{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *SDiffStore) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd SDiffStore) Run(w redis.Writer, red redis.Redka) (any, error) {
n, err := red.Set().DiffStore(cmd.dest, cmd.keys...) n, err := red.Set().DiffStore(cmd.dest, cmd.keys...)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -43,6 +43,8 @@ func TestSDiffStoreParse(t *testing.T) {
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.dest, test.want.dest) testx.AssertEqual(t, cmd.dest, test.want.dest)
testx.AssertEqual(t, cmd.keys, test.want.keys) testx.AssertEqual(t, cmd.keys, test.want.keys)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -13,18 +13,18 @@ type SInter struct {
keys []string keys []string
} }
func ParseSInter(b redis.BaseCmd) (*SInter, error) { func ParseSInter(b redis.BaseCmd) (SInter, error) {
cmd := &SInter{BaseCmd: b} cmd := SInter{BaseCmd: b}
err := parser.New( err := parser.New(
parser.Strings(&cmd.keys), parser.Strings(&cmd.keys),
).Required(1).Run(cmd.Args()) ).Required(1).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return SInter{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *SInter) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd SInter) Run(w redis.Writer, red redis.Redka) (any, error) {
elems, err := red.Set().Inter(cmd.keys...) elems, err := red.Set().Inter(cmd.keys...)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -37,6 +37,8 @@ func TestSInterParse(t *testing.T) {
testx.AssertEqual(t, err, test.err) testx.AssertEqual(t, err, test.err)
if err == nil { if err == nil {
testx.AssertEqual(t, cmd.keys, test.want.keys) testx.AssertEqual(t, cmd.keys, test.want.keys)
} else {
testx.AssertEqual(t, cmd, test.want)
} }
}) })
} }

View File

@@ -14,19 +14,19 @@ type SInterStore struct {
keys []string keys []string
} }
func ParseSInterStore(b redis.BaseCmd) (*SInterStore, error) { func ParseSInterStore(b redis.BaseCmd) (SInterStore, error) {
cmd := &SInterStore{BaseCmd: b} cmd := SInterStore{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.dest), parser.String(&cmd.dest),
parser.Strings(&cmd.keys), parser.Strings(&cmd.keys),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return SInterStore{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *SInterStore) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd SInterStore) Run(w redis.Writer, red redis.Redka) (any, error) {
n, err := red.Set().InterStore(cmd.dest, cmd.keys...) n, err := red.Set().InterStore(cmd.dest, cmd.keys...)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

View File

@@ -14,19 +14,19 @@ type SIsMember struct {
member []byte member []byte
} }
func ParseSIsMember(b redis.BaseCmd) (*SIsMember, error) { func ParseSIsMember(b redis.BaseCmd) (SIsMember, error) {
cmd := &SIsMember{BaseCmd: b} cmd := SIsMember{BaseCmd: b}
err := parser.New( err := parser.New(
parser.String(&cmd.key), parser.String(&cmd.key),
parser.Bytes(&cmd.member), parser.Bytes(&cmd.member),
).Required(2).Run(cmd.Args()) ).Required(2).Run(cmd.Args())
if err != nil { if err != nil {
return nil, err return SIsMember{}, err
} }
return cmd, nil return cmd, nil
} }
func (cmd *SIsMember) Run(w redis.Writer, red redis.Redka) (any, error) { func (cmd SIsMember) Run(w redis.Writer, red redis.Redka) (any, error) {
ok, err := red.Set().Exists(cmd.key, cmd.member) ok, err := red.Set().Exists(cmd.key, cmd.member)
if err != nil { if err != nil {
w.WriteError(cmd.Error(err)) w.WriteError(cmd.Error(err))

Some files were not shown because too many files have changed in this diff Show More