diff options
| -rw-r--r-- | handlers.go | 38 | ||||
| -rw-r--r-- | main.go | 1 |
2 files changed, 39 insertions, 0 deletions
diff --git a/handlers.go b/handlers.go index 5bf16a8..3b7fb76 100644 --- a/handlers.go +++ b/handlers.go @@ -200,6 +200,12 @@ func handleRpush(conn net.Conn, args []string) { key := args[1] newItems := args[2:] + if len(args) < 3 { + err := errors.New("wrong number of arguments for 'RPUSH'") + conn.Write(serializeRESP(err)) + return + } + db.mu.Lock() defer db.mu.Unlock() @@ -222,6 +228,38 @@ func handleRpush(conn net.Conn, args []string) { conn.Write(serializeRESP(len(list))) } +func handleLpush(conn net.Conn, args []string) { + key := args[1] + newItems := args[2:] + + if len(args) < 3 { + err := errors.New("wrong number of arguments for 'LPUSH'") + conn.Write(serializeRESP(err)) + return + } + + db.mu.Lock() + defer db.mu.Unlock() + + var list []string + existingItem, exists := db.data[key] + + if exists { + var ok bool + list, ok = existingItem.Value.([]string) + if !ok { + err := errors.New("WRONGTYPE Operation against a key holding the wrong kind of value") + conn.Write(serializeRESP(err)) + return + } + } else { + list = []string{} + } + list = append(newItems, list...) + db.data[key] = Item{Value: list} + conn.Write(serializeRESP(len(list))) +} + func handleLrange(conn net.Conn, args []string) { db.mu.Lock() defer db.mu.Unlock() @@ -25,6 +25,7 @@ var commandRegistry = map[string]handlerFunc{ "PING": handlePing, "FLUSHALL": handleFlushall, "RPUSH": handleRpush, + "LPUSH": handleLpush, "LRANGE": handleLrange, "LPOP": handleLpop, "RPOP": handleRpop, |
