diff --git a/cmd_connection.go b/cmd_connection.go index 521f3d9..e403c94 100644 --- a/cmd_connection.go +++ b/cmd_connection.go @@ -192,15 +192,7 @@ func (m *Miniredis) cmdHello(c *server.Peer, cmd string, args []string) { // ECHO func (m *Miniredis) cmdEcho(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } diff --git a/cmd_geo.go b/cmd_geo.go index 97f74c3..4d35a75 100644 --- a/cmd_geo.go +++ b/cmd_geo.go @@ -24,17 +24,16 @@ func commandsGeo(m *Miniredis) { // GEOADD func (m *Miniredis) cmdGeoadd(c *server.Peer, cmd string, args []string) { - if len(args) < 3 || len(args[1:])%3 != 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + + if len(args[1:])%3 != 0 { + setDirty(c) + c.WriteError(errWrongNumber(cmd)) return } + key, args := args[0], args[1:] withTx(m, c, func(c *server.Peer, ctx *connCtx) { @@ -83,15 +82,7 @@ func (m *Miniredis) cmdGeoadd(c *server.Peer, cmd string, args []string) { // GEODIST func (m *Miniredis) cmdGeodist(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -141,17 +132,10 @@ func (m *Miniredis) cmdGeodist(c *server.Peer, cmd string, args []string) { // GEOPOS func (m *Miniredis) cmdGeopos(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } + key, args := args[0], args[1:] withTx(m, c, func(c *server.Peer, ctx *connCtx) { @@ -187,15 +171,7 @@ type geoDistance struct { // GEORADIUS and GEORADIUS_RO func (m *Miniredis) cmdGeoradius(c *server.Peer, cmd string, args []string) { - if len(args) < 5 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(5)) { return } @@ -374,15 +350,7 @@ func (m *Miniredis) cmdGeoradius(c *server.Peer, cmd string, args []string) { // GEORADIUSBYMEMBER and GEORADIUSBYMEMBER_RO func (m *Miniredis) cmdGeoradiusbymember(c *server.Peer, cmd string, args []string) { - if len(args) < 4 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(4)) { return } diff --git a/cmd_hash.go b/cmd_hash.go index 5533295..0c30e2a 100644 --- a/cmd_hash.go +++ b/cmd_hash.go @@ -32,15 +32,7 @@ func commandsHash(m *Miniredis) { // HSET func (m *Miniredis) cmdHset(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -66,15 +58,7 @@ func (m *Miniredis) cmdHset(c *server.Peer, cmd string, args []string) { // HSETNX func (m *Miniredis) cmdHsetnx(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -113,15 +97,7 @@ func (m *Miniredis) cmdHsetnx(c *server.Peer, cmd string, args []string) { // HMSET func (m *Miniredis) cmdHmset(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -151,15 +127,7 @@ func (m *Miniredis) cmdHmset(c *server.Peer, cmd string, args []string) { // HGET func (m *Miniredis) cmdHget(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -188,15 +156,7 @@ func (m *Miniredis) cmdHget(c *server.Peer, cmd string, args []string) { // HDEL func (m *Miniredis) cmdHdel(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -242,15 +202,7 @@ func (m *Miniredis) cmdHdel(c *server.Peer, cmd string, args []string) { // HEXISTS func (m *Miniredis) cmdHexists(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -285,15 +237,7 @@ func (m *Miniredis) cmdHexists(c *server.Peer, cmd string, args []string) { // HGETALL func (m *Miniredis) cmdHgetall(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -322,15 +266,7 @@ func (m *Miniredis) cmdHgetall(c *server.Peer, cmd string, args []string) { // HKEYS func (m *Miniredis) cmdHkeys(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -358,15 +294,7 @@ func (m *Miniredis) cmdHkeys(c *server.Peer, cmd string, args []string) { // HSTRLEN func (m *Miniredis) cmdHstrlen(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -392,15 +320,7 @@ func (m *Miniredis) cmdHstrlen(c *server.Peer, cmd string, args []string) { // HVALS func (m *Miniredis) cmdHvals(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -429,15 +349,7 @@ func (m *Miniredis) cmdHvals(c *server.Peer, cmd string, args []string) { // HLEN func (m *Miniredis) cmdHlen(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -462,15 +374,7 @@ func (m *Miniredis) cmdHlen(c *server.Peer, cmd string, args []string) { // HMGET func (m *Miniredis) cmdHmget(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -503,15 +407,7 @@ func (m *Miniredis) cmdHmget(c *server.Peer, cmd string, args []string) { // HINCRBY func (m *Miniredis) cmdHincrby(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -546,15 +442,7 @@ func (m *Miniredis) cmdHincrby(c *server.Peer, cmd string, args []string) { // HINCRBYFLOAT func (m *Miniredis) cmdHincrbyfloat(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -593,15 +481,7 @@ func (m *Miniredis) cmdHincrbyfloat(c *server.Peer, cmd string, args []string) { // HSCAN func (m *Miniredis) cmdHscan(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -685,15 +565,7 @@ func (m *Miniredis) cmdHscan(c *server.Peer, cmd string, args []string) { // HRANDFIELD func (m *Miniredis) cmdHrandfield(c *server.Peer, cmd string, args []string) { - if len(args) > 3 || len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, between(1, 3)) { return } diff --git a/cmd_hll.go b/cmd_hll.go index ffb4d6f..c7963fa 100644 --- a/cmd_hll.go +++ b/cmd_hll.go @@ -11,15 +11,7 @@ func commandsHll(m *Miniredis) { // PFADD func (m *Miniredis) cmdPfadd(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -40,15 +32,7 @@ func (m *Miniredis) cmdPfadd(c *server.Peer, cmd string, args []string) { // PFCOUNT func (m *Miniredis) cmdPfcount(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -69,15 +53,7 @@ func (m *Miniredis) cmdPfcount(c *server.Peer, cmd string, args []string) { // PFMERGE func (m *Miniredis) cmdPfmerge(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } diff --git a/cmd_list.go b/cmd_list.go index 5819945..c4f397c 100644 --- a/cmd_list.go +++ b/cmd_list.go @@ -52,15 +52,7 @@ func (m *Miniredis) cmdBrpop(c *server.Peer, cmd string, args []string) { } func (m *Miniredis) cmdBXpop(c *server.Peer, cmd string, args []string, lr leftright) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -115,15 +107,7 @@ func (m *Miniredis) cmdBXpop(c *server.Peer, cmd string, args []string, lr leftr // LINDEX func (m *Miniredis) cmdLindex(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -164,16 +148,7 @@ func (m *Miniredis) cmdLindex(c *server.Peer, cmd string, args []string) { // LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len] func (m *Miniredis) cmdLpos(c *server.Peer, cmd string, args []string) { - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { - return - } - - if len(args) == 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -311,15 +286,7 @@ func (m *Miniredis) cmdLpos(c *server.Peer, cmd string, args []string) { // LINSERT func (m *Miniredis) cmdLinsert(c *server.Peer, cmd string, args []string) { - if len(args) != 4 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(4)) { return } @@ -378,15 +345,7 @@ func (m *Miniredis) cmdLinsert(c *server.Peer, cmd string, args []string) { // LLEN func (m *Miniredis) cmdLlen(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -421,15 +380,7 @@ func (m *Miniredis) cmdRpop(c *server.Peer, cmd string, args []string) { } func (m *Miniredis) cmdXpop(c *server.Peer, cmd string, args []string, lr leftright) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -513,15 +464,7 @@ func (m *Miniredis) cmdRpush(c *server.Peer, cmd string, args []string) { } func (m *Miniredis) cmdXpush(c *server.Peer, cmd string, args []string, lr leftright) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -559,15 +502,7 @@ func (m *Miniredis) cmdRpushx(c *server.Peer, cmd string, args []string) { } func (m *Miniredis) cmdXpushx(c *server.Peer, cmd string, args []string, lr leftright) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -600,15 +535,7 @@ func (m *Miniredis) cmdXpushx(c *server.Peer, cmd string, args []string, lr left // LRANGE func (m *Miniredis) cmdLrange(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -650,15 +577,7 @@ func (m *Miniredis) cmdLrange(c *server.Peer, cmd string, args []string) { // LREM func (m *Miniredis) cmdLrem(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -724,15 +643,7 @@ func (m *Miniredis) cmdLrem(c *server.Peer, cmd string, args []string) { // LSET func (m *Miniredis) cmdLset(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -777,15 +688,7 @@ func (m *Miniredis) cmdLset(c *server.Peer, cmd string, args []string) { // LTRIM func (m *Miniredis) cmdLtrim(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -831,15 +734,7 @@ func (m *Miniredis) cmdLtrim(c *server.Peer, cmd string, args []string) { // RPOPLPUSH func (m *Miniredis) cmdRpoplpush(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -864,15 +759,7 @@ func (m *Miniredis) cmdRpoplpush(c *server.Peer, cmd string, args []string) { // BRPOPLPUSH func (m *Miniredis) cmdBrpoplpush(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -918,15 +805,7 @@ func (m *Miniredis) cmdBrpoplpush(c *server.Peer, cmd string, args []string) { // LMOVE func (m *Miniredis) cmdLmove(c *server.Peer, cmd string, args []string) { - if len(args) != 4 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(4)) { return } @@ -979,15 +858,7 @@ func (m *Miniredis) cmdLmove(c *server.Peer, cmd string, args []string) { // BLMOVE func (m *Miniredis) cmdBlmove(c *server.Peer, cmd string, args []string) { - if len(args) != 5 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(5)) { return } diff --git a/cmd_object.go b/cmd_object.go index b958a95..e8117c5 100644 --- a/cmd_object.go +++ b/cmd_object.go @@ -14,15 +14,7 @@ func commandsObject(m *Miniredis) { // OBJECT func (m *Miniredis) cmdObject(c *server.Peer, cmd string, args []string) { - if len(args) == 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } diff --git a/cmd_pubsub.go b/cmd_pubsub.go index 0fc9f0d..571431e 100644 --- a/cmd_pubsub.go +++ b/cmd_pubsub.go @@ -173,15 +173,7 @@ func (m *Miniredis) cmdPunsubscribe(c *server.Peer, cmd string, args []string) { // PUBLISH func (m *Miniredis) cmdPublish(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } diff --git a/cmd_scripting.go b/cmd_scripting.go index 188a15e..340ccc4 100644 --- a/cmd_scripting.go +++ b/cmd_scripting.go @@ -151,17 +151,10 @@ func compile(script string) (*lua.FunctionProto, error) { } func (m *Miniredis) cmdEval(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } + ctx := getCtx(c) if ctx.nested { c.WriteError(msgNotFromScripts(ctx.nestedSHA)) @@ -180,17 +173,10 @@ func (m *Miniredis) cmdEval(c *server.Peer, cmd string, args []string) { } func (m *Miniredis) cmdEvalsha(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } + ctx := getCtx(c) if ctx.nested { c.WriteError(msgNotFromScripts(ctx.nestedSHA)) @@ -211,15 +197,7 @@ func (m *Miniredis) cmdEvalsha(c *server.Peer, cmd string, args []string) { } func (m *Miniredis) cmdScript(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } diff --git a/cmd_server.go b/cmd_server.go index 5fe55dd..cd74704 100644 --- a/cmd_server.go +++ b/cmd_server.go @@ -23,15 +23,7 @@ func commandsServer(m *Miniredis) { // MEMORY func (m *Miniredis) cmdMemory(c *server.Peer, cmd string, args []string) { - if len(args) == 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -85,15 +77,7 @@ func (m *Miniredis) cmdMemory(c *server.Peer, cmd string, args []string) { // DBSIZE func (m *Miniredis) cmdDbsize(c *server.Peer, cmd string, args []string) { - if len(args) > 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(0)) { return } @@ -152,15 +136,7 @@ func (m *Miniredis) cmdFlushdb(c *server.Peer, cmd string, args []string) { // TIME func (m *Miniredis) cmdTime(c *server.Peer, cmd string, args []string) { - if len(args) > 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(0)) { return } diff --git a/cmd_set.go b/cmd_set.go index 12e4d58..7d01bb2 100644 --- a/cmd_set.go +++ b/cmd_set.go @@ -33,15 +33,7 @@ func commandsSet(m *Miniredis) { // SADD func (m *Miniredis) cmdSadd(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -62,15 +54,7 @@ func (m *Miniredis) cmdSadd(c *server.Peer, cmd string, args []string) { // SCARD func (m *Miniredis) cmdScard(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -96,15 +80,7 @@ func (m *Miniredis) cmdScard(c *server.Peer, cmd string, args []string) { // SDIFF func (m *Miniredis) cmdSdiff(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -128,15 +104,7 @@ func (m *Miniredis) cmdSdiff(c *server.Peer, cmd string, args []string) { // SDIFFSTORE func (m *Miniredis) cmdSdiffstore(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -159,15 +127,7 @@ func (m *Miniredis) cmdSdiffstore(c *server.Peer, cmd string, args []string) { // SINTER func (m *Miniredis) cmdSinter(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -191,15 +151,7 @@ func (m *Miniredis) cmdSinter(c *server.Peer, cmd string, args []string) { // SINTERSTORE func (m *Miniredis) cmdSinterstore(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -222,15 +174,7 @@ func (m *Miniredis) cmdSinterstore(c *server.Peer, cmd string, args []string) { // SINTERCARD func (m *Miniredis) cmdSintercard(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -293,15 +237,7 @@ func (m *Miniredis) cmdSintercard(c *server.Peer, cmd string, args []string) { // SISMEMBER func (m *Miniredis) cmdSismember(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -330,15 +266,7 @@ func (m *Miniredis) cmdSismember(c *server.Peer, cmd string, args []string) { // SMEMBERS func (m *Miniredis) cmdSmembers(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -368,15 +296,7 @@ func (m *Miniredis) cmdSmembers(c *server.Peer, cmd string, args []string) { // SMISMEMBER func (m *Miniredis) cmdSmismember(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -412,15 +332,7 @@ func (m *Miniredis) cmdSmismember(c *server.Peer, cmd string, args []string) { // SMOVE func (m *Miniredis) cmdSmove(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -456,15 +368,7 @@ func (m *Miniredis) cmdSmove(c *server.Peer, cmd string, args []string) { // SPOP func (m *Miniredis) cmdSpop(c *server.Peer, cmd string, args []string) { - if len(args) == 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -547,22 +451,15 @@ func (m *Miniredis) cmdSpop(c *server.Peer, cmd string, args []string) { // SRANDMEMBER func (m *Miniredis) cmdSrandmember(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } + if len(args) > 2 { setDirty(c) c.WriteError(msgSyntaxError) return } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { - return - } key := args[0] count := 0 @@ -625,15 +522,7 @@ func (m *Miniredis) cmdSrandmember(c *server.Peer, cmd string, args []string) { // SREM func (m *Miniredis) cmdSrem(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -658,15 +547,7 @@ func (m *Miniredis) cmdSrem(c *server.Peer, cmd string, args []string) { // SUNION func (m *Miniredis) cmdSunion(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -690,15 +571,7 @@ func (m *Miniredis) cmdSunion(c *server.Peer, cmd string, args []string) { // SUNIONSTORE func (m *Miniredis) cmdSunionstore(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -721,15 +594,7 @@ func (m *Miniredis) cmdSunionstore(c *server.Peer, cmd string, args []string) { // SSCAN func (m *Miniredis) cmdSscan(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } diff --git a/cmd_sorted_set.go b/cmd_sorted_set.go index 85bc569..9838e39 100644 --- a/cmd_sorted_set.go +++ b/cmd_sorted_set.go @@ -46,15 +46,7 @@ func commandsSortedSet(m *Miniredis) { // ZADD func (m *Miniredis) cmdZadd(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -194,15 +186,7 @@ outer: // ZCARD func (m *Miniredis) cmdZcard(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -227,15 +211,7 @@ func (m *Miniredis) cmdZcard(c *server.Peer, cmd string, args []string) { // ZCOUNT func (m *Miniredis) cmdZcount(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -285,15 +261,7 @@ func (m *Miniredis) cmdZcount(c *server.Peer, cmd string, args []string) { // ZINCRBY func (m *Miniredis) cmdZincrby(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -332,15 +300,7 @@ func (m *Miniredis) makeCmdZinter(store bool) func(c *server.Peer, cmd string, a if store { minArgs++ } - if len(args) < minArgs { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(minArgs)) { return } @@ -513,15 +473,7 @@ func (m *Miniredis) makeCmdZinter(store bool) func(c *server.Peer, cmd string, a // ZLEXCOUNT func (m *Miniredis) cmdZlexcount(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -566,15 +518,7 @@ func (m *Miniredis) cmdZlexcount(c *server.Peer, cmd string, args []string) { // ZRANGE func (m *Miniredis) cmdZrange(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -668,15 +612,7 @@ func (m *Miniredis) cmdZrange(c *server.Peer, cmd string, args []string) { // ZREVRANGE func (m *Miniredis) cmdZrevrange(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -707,17 +643,10 @@ func (m *Miniredis) cmdZrevrange(c *server.Peer, cmd string, args []string) { // ZRANGEBYLEX and ZREVRANGEBYLEX func (m *Miniredis) makeCmdZrangebylex(reverse bool) server.Cmd { return func(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } + opts := optsRangeByLex{ Reverse: reverse, Key: args[0], @@ -756,15 +685,7 @@ func (m *Miniredis) makeCmdZrangebylex(reverse bool) server.Cmd { // ZRANGEBYSCORE and ZREVRANGEBYSCORE func (m *Miniredis) makeCmdZrangebyscore(reverse bool) server.Cmd { return func(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -808,15 +729,7 @@ func (m *Miniredis) makeCmdZrangebyscore(reverse bool) server.Cmd { // ZRANK and ZREVRANK func (m *Miniredis) makeCmdZrank(reverse bool) server.Cmd { return func(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -878,15 +791,7 @@ func (m *Miniredis) makeCmdZrank(reverse bool) server.Cmd { // ZREM func (m *Miniredis) cmdZrem(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -917,15 +822,7 @@ func (m *Miniredis) cmdZrem(c *server.Peer, cmd string, args []string) { // ZREMRANGEBYLEX func (m *Miniredis) cmdZremrangebylex(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -973,15 +870,7 @@ func (m *Miniredis) cmdZremrangebylex(c *server.Peer, cmd string, args []string) // ZREMRANGEBYRANK func (m *Miniredis) cmdZremrangebyrank(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -1023,15 +912,7 @@ func (m *Miniredis) cmdZremrangebyrank(c *server.Peer, cmd string, args []string // ZREMRANGEBYSCORE func (m *Miniredis) cmdZremrangebyscore(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -1084,15 +965,7 @@ func (m *Miniredis) cmdZremrangebyscore(c *server.Peer, cmd string, args []strin // ZSCORE func (m *Miniredis) cmdZscore(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -1122,15 +995,7 @@ func (m *Miniredis) cmdZscore(c *server.Peer, cmd string, args []string) { // ZMSCORE func (m *Miniredis) cmdZMscore(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -1271,16 +1136,7 @@ func withLexRange(members []string, min string, minIncl bool, max string, maxInc // ZUNION func (m *Miniredis) cmdZunion(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -1348,15 +1204,7 @@ func (m *Miniredis) cmdZunion(c *server.Peer, cmd string, args []string) { // ZUNIONSTORE func (m *Miniredis) cmdZunionstore(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -1508,15 +1356,7 @@ func executeZUnion(db *RedisDB, opts zunionOptions) (sortedSet, error) { // ZSCAN func (m *Miniredis) cmdZscan(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -1680,15 +1520,7 @@ func (m *Miniredis) cmdZpopmax(reverse bool) server.Cmd { // ZRANDMEMBER func (m *Miniredis) cmdZrandmember(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } diff --git a/cmd_stream.go b/cmd_stream.go index 7ce89d1..0167eaf 100644 --- a/cmd_stream.go +++ b/cmd_stream.go @@ -33,15 +33,7 @@ func commandsStream(m *Miniredis) { // XADD func (m *Miniredis) cmdXadd(c *server.Peer, cmd string, args []string) { - if len(args) < 4 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(4)) { return } @@ -137,15 +129,7 @@ func (m *Miniredis) cmdXadd(c *server.Peer, cmd string, args []string) { // XLEN func (m *Miniredis) cmdXlen(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -171,9 +155,7 @@ func (m *Miniredis) cmdXlen(c *server.Peer, cmd string, args []string) { // XRANGE and XREVRANGE func (m *Miniredis) makeCmdXrange(reverse bool) server.Cmd { return func(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } if len(args) == 4 || len(args) > 5 { @@ -181,12 +163,6 @@ func (m *Miniredis) makeCmdXrange(reverse bool) server.Cmd { c.WriteError(msgSyntaxError) return } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { - return - } opts := struct { key string @@ -320,15 +296,7 @@ func (m *Miniredis) makeCmdXrange(reverse bool) server.Cmd { // XGROUP func (m *Miniredis) cmdXgroup(c *server.Peer, cmd string, args []string) { - if len(args) == 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -513,15 +481,7 @@ func (m *Miniredis) cmdXgroupDelconsumer(c *server.Peer, cmd string, args []stri // XINFO func (m *Miniredis) cmdXinfo(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -684,15 +644,7 @@ func (m *Miniredis) sinceMilli(t time.Time) int { // XREADGROUP func (m *Miniredis) cmdXreadgroup(c *server.Peer, cmd string, args []string) { // XREADGROUP GROUP group consumer STREAMS key ID - if len(args) < 6 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(6)) { return } @@ -871,15 +823,7 @@ func xreadgroup( // XACK func (m *Miniredis) cmdXack(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -908,15 +852,7 @@ func (m *Miniredis) cmdXack(c *server.Peer, cmd string, args []string) { // XDEL func (m *Miniredis) cmdXdel(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -946,15 +882,7 @@ func (m *Miniredis) cmdXdel(c *server.Peer, cmd string, args []string) { // XREAD func (m *Miniredis) cmdXread(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -1128,15 +1056,7 @@ func writeXread(c *server.Peer, streams []string, res map[string][]StreamEntry) // XPENDING func (m *Miniredis) cmdXpending(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -1325,15 +1245,7 @@ func writeXpending( // XTRIM func (m *Miniredis) cmdXtrim(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -1431,15 +1343,7 @@ func (m *Miniredis) cmdXtrim(c *server.Peer, cmd string, args []string) { // XAUTOCLAIM func (m *Miniredis) cmdXautoclaim(c *server.Peer, cmd string, args []string) { // XAUTOCLAIM key group consumer min-idle-time start - if len(args) < 5 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(5)) { return } @@ -1596,15 +1500,7 @@ func writeXautoclaim(c *server.Peer, nextCallId string, res []StreamEntry, justI // XCLAIM func (m *Miniredis) cmdXclaim(c *server.Peer, cmd string, args []string) { - if len(args) < 5 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(5)) { return } diff --git a/cmd_string.go b/cmd_string.go index 08e6774..9e9b859 100644 --- a/cmd_string.go +++ b/cmd_string.go @@ -42,15 +42,7 @@ func commandsString(m *Miniredis) { // SET func (m *Miniredis) cmdSet(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -191,15 +183,7 @@ func (m *Miniredis) cmdSet(c *server.Peer, cmd string, args []string) { // SETEX func (m *Miniredis) cmdSetex(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -229,15 +213,7 @@ func (m *Miniredis) cmdSetex(c *server.Peer, cmd string, args []string) { // PSETEX func (m *Miniredis) cmdPsetex(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -270,15 +246,7 @@ func (m *Miniredis) cmdPsetex(c *server.Peer, cmd string, args []string) { // SETNX func (m *Miniredis) cmdSetnx(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -299,15 +267,7 @@ func (m *Miniredis) cmdSetnx(c *server.Peer, cmd string, args []string) { // MSET func (m *Miniredis) cmdMset(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -334,15 +294,7 @@ func (m *Miniredis) cmdMset(c *server.Peer, cmd string, args []string) { // MSETNX func (m *Miniredis) cmdMsetnx(c *server.Peer, cmd string, args []string) { - if len(args) < 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(2)) { return } @@ -382,15 +334,7 @@ func (m *Miniredis) cmdMsetnx(c *server.Peer, cmd string, args []string) { // GET func (m *Miniredis) cmdGet(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -414,15 +358,7 @@ func (m *Miniredis) cmdGet(c *server.Peer, cmd string, args []string) { // GETEX func (m *Miniredis) cmdGetex(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -501,15 +437,7 @@ func (m *Miniredis) cmdGetex(c *server.Peer, cmd string, args []string) { // GETSET func (m *Miniredis) cmdGetset(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -538,15 +466,7 @@ func (m *Miniredis) cmdGetset(c *server.Peer, cmd string, args []string) { // GETDEL func (m *Miniredis) cmdGetdel(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -573,15 +493,7 @@ func (m *Miniredis) cmdGetdel(c *server.Peer, cmd string, args []string) { // MGET func (m *Miniredis) cmdMget(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -607,15 +519,7 @@ func (m *Miniredis) cmdMget(c *server.Peer, cmd string, args []string) { // INCR func (m *Miniredis) cmdIncr(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -639,15 +543,7 @@ func (m *Miniredis) cmdIncr(c *server.Peer, cmd string, args []string) { // INCRBY func (m *Miniredis) cmdIncrby(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -680,15 +576,7 @@ func (m *Miniredis) cmdIncrby(c *server.Peer, cmd string, args []string) { // INCRBYFLOAT func (m *Miniredis) cmdIncrbyfloat(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -720,15 +608,7 @@ func (m *Miniredis) cmdIncrbyfloat(c *server.Peer, cmd string, args []string) { // DECR func (m *Miniredis) cmdDecr(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -752,15 +632,7 @@ func (m *Miniredis) cmdDecr(c *server.Peer, cmd string, args []string) { // DECRBY func (m *Miniredis) cmdDecrby(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -793,15 +665,7 @@ func (m *Miniredis) cmdDecrby(c *server.Peer, cmd string, args []string) { // STRLEN func (m *Miniredis) cmdStrlen(c *server.Peer, cmd string, args []string) { - if len(args) != 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(1)) { return } @@ -821,15 +685,7 @@ func (m *Miniredis) cmdStrlen(c *server.Peer, cmd string, args []string) { // APPEND func (m *Miniredis) cmdAppend(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -852,15 +708,7 @@ func (m *Miniredis) cmdAppend(c *server.Peer, cmd string, args []string) { // GETRANGE func (m *Miniredis) cmdGetrange(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -892,15 +740,7 @@ func (m *Miniredis) cmdGetrange(c *server.Peer, cmd string, args []string) { // SETRANGE func (m *Miniredis) cmdSetrange(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } @@ -943,15 +783,7 @@ func (m *Miniredis) cmdSetrange(c *server.Peer, cmd string, args []string) { // BITCOUNT func (m *Miniredis) cmdBitcount(c *server.Peer, cmd string, args []string) { - if len(args) < 1 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -1002,15 +834,7 @@ func (m *Miniredis) cmdBitcount(c *server.Peer, cmd string, args []string) { // BITOP func (m *Miniredis) cmdBitop(c *server.Peer, cmd string, args []string) { - if len(args) < 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(3)) { return } @@ -1085,15 +909,7 @@ func (m *Miniredis) cmdBitop(c *server.Peer, cmd string, args []string) { // BITPOS func (m *Miniredis) cmdBitpos(c *server.Peer, cmd string, args []string) { - if len(args) < 2 || len(args) > 4 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, between(2, 4)) { return } @@ -1186,15 +1002,7 @@ func (m *Miniredis) cmdBitpos(c *server.Peer, cmd string, args []string) { // GETBIT func (m *Miniredis) cmdGetbit(c *server.Peer, cmd string, args []string) { - if len(args) != 2 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(2)) { return } @@ -1238,15 +1046,7 @@ func (m *Miniredis) cmdGetbit(c *server.Peer, cmd string, args []string) { // SETBIT func (m *Miniredis) cmdSetbit(c *server.Peer, cmd string, args []string) { - if len(args) != 3 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(3)) { return } diff --git a/cmd_transactions.go b/cmd_transactions.go index 94729e0..93d5354 100644 --- a/cmd_transactions.go +++ b/cmd_transactions.go @@ -17,14 +17,7 @@ func commandsTransaction(m *Miniredis) { // MULTI func (m *Miniredis) cmdMulti(c *server.Peer, cmd string, args []string) { - if len(args) != 0 { - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(0)) { return } @@ -45,15 +38,7 @@ func (m *Miniredis) cmdMulti(c *server.Peer, cmd string, args []string) { // EXEC func (m *Miniredis) cmdExec(c *server.Peer, cmd string, args []string) { - if len(args) != 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(0)) { return } @@ -99,15 +84,7 @@ func (m *Miniredis) cmdExec(c *server.Peer, cmd string, args []string) { // DISCARD func (m *Miniredis) cmdDiscard(c *server.Peer, cmd string, args []string) { - if len(args) != 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(0)) { return } @@ -123,15 +100,7 @@ func (m *Miniredis) cmdDiscard(c *server.Peer, cmd string, args []string) { // WATCH func (m *Miniredis) cmdWatch(c *server.Peer, cmd string, args []string) { - if len(args) == 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, atLeast(1)) { return } @@ -157,15 +126,7 @@ func (m *Miniredis) cmdWatch(c *server.Peer, cmd string, args []string) { // UNWATCH func (m *Miniredis) cmdUnwatch(c *server.Peer, cmd string, args []string) { - if len(args) != 0 { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) - return - } - if !m.handleAuth(c) { - return - } - if m.checkPubsub(c, cmd) { + if !m.isValidCMD(c, cmd, args, exactly(0)) { return } diff --git a/miniredis.go b/miniredis.go index 33b31ee..72a145a 100644 --- a/miniredis.go +++ b/miniredis.go @@ -485,16 +485,16 @@ func exactly(n int) argRequirements { // isValidCMD returns true if command is valid and can be executed. func (m *Miniredis) isValidCMD(c *server.Peer, cmd string, args []string, argReqs argRequirements) bool { - if !m.handleAuth(c) { + if len(args) < argReqs.minimum || (argReqs.maximum != nil && len(args) > *argReqs.maximum) { + setDirty(c) + c.WriteError(errWrongNumber(cmd)) return false } - if m.checkPubsub(c, cmd) { + + if !m.handleAuth(c) { return false } - - if len(args) < argReqs.minimum || (argReqs.maximum != nil && len(args) > *argReqs.maximum) { - setDirty(c) - c.WriteError(errWrongNumber(cmd)) + if m.checkPubsub(c, cmd) { return false }