diff options
Diffstat (limited to 'pkg/core/redisDB.go')
| -rw-r--r-- | pkg/core/redisDB.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/pkg/core/redisDB.go b/pkg/core/redisDB.go new file mode 100644 index 0000000..cbd737c --- /dev/null +++ b/pkg/core/redisDB.go @@ -0,0 +1,61 @@ +package core + +import ( + "fmt" + "time" +) + + +type Item struct { + Value any + ExpiresAt *time.Time +} + +type RedisDB struct { + Shards []*Shard +} + +type SimpleString string + +func SerializeRESP(v any) []byte { + switch val := v.(type) { + case string: + bulkString := fmt.Sprintf("$%d\r\n%s\r\n", len(val), val) + return []byte(bulkString) + case int: + integerString := fmt.Sprintf(":%d\r\n",val) + return []byte(integerString) + case nil: + return []byte("$-1\r\n") + case error: + errorString := fmt.Sprintf("-ERR %s\r\n",val.Error()) + return []byte(errorString) + case []string: + size := len(val) + result := []byte(fmt.Sprintf("*%d\r\n", size)) + for i := 0; i < size; i++ { + result = append(result, SerializeRESP(val[i])...) + } + return result + case []any: + size := len(val) + result := []byte(fmt.Sprintf("*%d\r\n", size)) + for i := 0; i < size; i++ { + result = append(result, SerializeRESP(val[i])...) + } + return result + case map[string]string: + size := len(val) + result := []byte(fmt.Sprintf("*%d\r\n", size*2)) + for key, value := range val { + result = append(result, SerializeRESP(key)...) + result = append(result, SerializeRESP(value)...) + } + return result + case SimpleString: + simpleStr := fmt.Sprintf("+%s\r\n", val) + return []byte(simpleStr) + default: + return []byte("-ERR internal server error: unknown type\r\n") + } +} |
