package commands import ( "errors" "redisClone/pkg/core" ) func SingleKey(args []string) []string { return []string{args[1]} } func AllSubsequentKeys(args []string) []string { return args[1:] } func NoKeys(args []string) []string { return nil } type CommandDef struct{ MinArgs int ExtractKeys func(args []string)[]string Execute func(args []string, getShard func(k string) *core.Shard) interface{} } func DispatchBaseCommand(db core.RedisDB ,commandName string, args []string) interface{} { cmd, exists := Registry[commandName] if !exists { return nil } if len(args) < cmd.MinArgs { return errors.New("wrong number of arguments") } keys := cmd.ExtractKeys(args) db.Lock(keys) defer db.Unlock(keys) return cmd.Execute(args, db.GetShard) } var Registry = map[string]CommandDef{ "GET": { MinArgs: 2, ExtractKeys: SingleKey, Execute: Get, }, "SET": { MinArgs: 3, ExtractKeys: SingleKey, Execute: Set, }, "DEL": { MinArgs: 2, ExtractKeys: AllSubsequentKeys, Execute: Del, }, "EXISTS": { MinArgs: 2, ExtractKeys: SingleKey, Execute: Exists, }, "INCR": { MinArgs: 2, ExtractKeys: SingleKey, Execute: Incr, }, "DECR": { MinArgs: 2, ExtractKeys: SingleKey, Execute: Decr, }, "RENAME": { MinArgs: 3, ExtractKeys: SingleKey, Execute: Rename, }, "RPUSH": { MinArgs: 3, ExtractKeys: SingleKey, Execute: Rpush, }, "LPUSH": { MinArgs: 3, ExtractKeys: SingleKey, Execute: Lpush, }, "RPOP": { MinArgs: 2, ExtractKeys: SingleKey, Execute: Rpop, }, "LPOP": { MinArgs: 2, ExtractKeys: SingleKey, Execute: Lpop, }, "LRANGE": { MinArgs: 4, ExtractKeys: SingleKey, Execute: Lrange, }, }