Files
redka/redsrv/internal/command/command.go
2025-07-13 22:37:43 +05:00

240 lines
5.3 KiB
Go

// Package command implements Redis-compatible commands
// for operations on data structures.
package command
import (
"strings"
"github.com/nalgeon/redka/redsrv/internal/command/conn"
"github.com/nalgeon/redka/redsrv/internal/command/hash"
"github.com/nalgeon/redka/redsrv/internal/command/key"
"github.com/nalgeon/redka/redsrv/internal/command/list"
"github.com/nalgeon/redka/redsrv/internal/command/server"
"github.com/nalgeon/redka/redsrv/internal/command/set"
str "github.com/nalgeon/redka/redsrv/internal/command/string"
"github.com/nalgeon/redka/redsrv/internal/command/zset"
"github.com/nalgeon/redka/redsrv/internal/redis"
)
// Parse parses a text representation of a command into a Cmd.
func Parse(args [][]byte) (redis.Cmd, error) {
name := strings.ToLower(string(args[0]))
b := redis.NewBaseCmd(args)
switch name {
// server
case "command":
return server.ParseOK(b)
case "config":
return server.ParseConfig(b)
case "dbsize":
return server.ParseDBSize(b)
case "flushdb":
return key.ParseFlushDB(b)
case "flushall":
return key.ParseFlushDB(b)
case "info":
return server.ParseOK(b)
case "lolwut":
return server.ParseLolwut(b)
// connection
case "echo":
return conn.ParseEcho(b)
case "ping":
return conn.ParsePing(b)
case "select":
return conn.ParseSelect(b)
// key
case "del":
return key.ParseDel(b)
case "exists":
return key.ParseExists(b)
case "expire":
return key.ParseExpire(b, 1000)
case "expireat":
return key.ParseExpireAt(b, 1000)
case "keys":
return key.ParseKeys(b)
case "persist":
return key.ParsePersist(b)
case "pexpire":
return key.ParseExpire(b, 1)
case "pexpireat":
return key.ParseExpireAt(b, 1)
case "randomkey":
return key.ParseRandomKey(b)
case "rename":
return key.ParseRename(b)
case "renamenx":
return key.ParseRenameNX(b)
case "scan":
return key.ParseScan(b)
case "ttl":
return key.ParseTTL(b)
case "type":
return key.ParseType(b)
// list
case "lindex":
return list.ParseLIndex(b)
case "linsert":
return list.ParseLInsert(b)
case "llen":
return list.ParseLLen(b)
case "lpop":
return list.ParseLPop(b)
case "lpush":
return list.ParseLPush(b)
case "lrange":
return list.ParseLRange(b)
case "lrem":
return list.ParseLRem(b)
case "lset":
return list.ParseLSet(b)
case "ltrim":
return list.ParseLTrim(b)
case "rpop":
return list.ParseRPop(b)
case "rpoplpush":
return list.ParseRPopLPush(b)
case "rpush":
return list.ParseRPush(b)
// string
case "decr":
return str.ParseIncr(b, -1)
case "decrby":
return str.ParseIncrBy(b, -1)
case "get":
return str.ParseGet(b)
case "getset":
return str.ParseGetSet(b)
case "incr":
return str.ParseIncr(b, 1)
case "incrby":
return str.ParseIncrBy(b, 1)
case "incrbyfloat":
return str.ParseIncrByFloat(b)
case "mget":
return str.ParseMGet(b)
case "mset":
return str.ParseMSet(b)
case "psetex":
return str.ParseSetEX(b, 1)
case "set":
return str.ParseSet(b)
case "setex":
return str.ParseSetEX(b, 1000)
case "setnx":
return str.ParseSetNX(b)
case "strlen":
return str.ParseStrlen(b)
// hash
case "hdel":
return hash.ParseHDel(b)
case "hexists":
return hash.ParseHExists(b)
case "hget":
return hash.ParseHGet(b)
case "hgetall":
return hash.ParseHGetAll(b)
case "hincrby":
return hash.ParseHIncrBy(b)
case "hincrbyfloat":
return hash.ParseHIncrByFloat(b)
case "hkeys":
return hash.ParseHKeys(b)
case "hlen":
return hash.ParseHLen(b)
case "hmget":
return hash.ParseHMGet(b)
case "hmset":
return hash.ParseHMSet(b)
case "hscan":
return hash.ParseHScan(b)
case "hset":
return hash.ParseHSet(b)
case "hsetnx":
return hash.ParseHSetNX(b)
case "hvals":
return hash.ParseHVals(b)
// set
case "sadd":
return set.ParseSAdd(b)
case "scard":
return set.ParseSCard(b)
case "sdiff":
return set.ParseSDiff(b)
case "sdiffstore":
return set.ParseSDiffStore(b)
case "sinter":
return set.ParseSInter(b)
case "sinterstore":
return set.ParseSInterStore(b)
case "sismember":
return set.ParseSIsMember(b)
case "smembers":
return set.ParseSMembers(b)
case "smove":
return set.ParseSMove(b)
case "spop":
return set.ParseSPop(b)
case "srandmember":
return set.ParseSRandMember(b)
case "srem":
return set.ParseSRem(b)
case "sscan":
return set.ParseSScan(b)
case "sunion":
return set.ParseSUnion(b)
case "sunionstore":
return set.ParseSUnionStore(b)
// sorted set
case "zadd":
return zset.ParseZAdd(b)
case "zcard":
return zset.ParseZCard(b)
case "zcount":
return zset.ParseZCount(b)
case "zincrby":
return zset.ParseZIncrBy(b)
case "zinter":
return zset.ParseZInter(b)
case "zinterstore":
return zset.ParseZInterStore(b)
case "zrange":
return zset.ParseZRange(b)
case "zrangebyscore":
return zset.ParseZRangeByScore(b)
case "zrank":
return zset.ParseZRank(b)
case "zrem":
return zset.ParseZRem(b)
case "zremrangebyrank":
return zset.ParseZRemRangeByRank(b)
case "zremrangebyscore":
return zset.ParseZRemRangeByScore(b)
case "zrevrange":
return zset.ParseZRevRange(b)
case "zrevrangebyscore":
return zset.ParseZRevRangeByScore(b)
case "zrevrank":
return zset.ParseZRevRank(b)
case "zscan":
return zset.ParseZScan(b)
case "zscore":
return zset.ParseZScore(b)
case "zunion":
return zset.ParseZUnion(b)
case "zunionstore":
return zset.ParseZUnionStore(b)
default:
return server.ParseUnknown(b)
}
}