Update Any rules

This commit is contained in:
tidwall 2020-03-06 10:08:10 -07:00
parent 1f5e70c2d8
commit 157aa68817
2 changed files with 48 additions and 7 deletions

View File

@ -331,29 +331,62 @@ func AppendBulkUint(dst []byte, x uint64) []byte {
return AppendBulk(dst, strconv.AppendUint(nil, x, 10)) return AppendBulk(dst, strconv.AppendUint(nil, x, 10))
} }
// AppendAny appends any type to valid Redis type func prefixERRIfNeeded(msg string) string {
msg = strings.TrimSpace(msg)
firstWord := strings.Split(msg, " ")[0]
addERR := len(firstWord) == 0
for i := 0; i < len(firstWord); i++ {
if firstWord[i] < 'A' || firstWord[i] > 'Z' {
addERR = true
break
}
}
if addERR {
msg = strings.TrimSpace("ERR " + msg)
}
return msg
}
// SimpleString is for representing a non-bulk representation of a string
// from an *Any call.
type SimpleString string
// SimpleInt is for representing a non-bulk representation of a int
// from an *Any call.
type SimpleInt int
// AppendAny appends any type to valid Redis type.
// nil -> null
// error -> error (adds "ERR " when first word is not uppercase)
// string -> bulk-string // string -> bulk-string
// numbers -> bulk-string // numbers -> bulk-string
// []byte -> bulk-string // []byte -> bulk-string
// bool -> number (0 or 1) // bool -> bulk-string ("0" or "1")
// slice -> array // slice -> array
// map -> array with key/value pairs // map -> array with key/value pairs
// SimpleString -> string
// SimpleInt -> integer
// everything-else -> bulk-string representation using fmt.Sprint() // everything-else -> bulk-string representation using fmt.Sprint()
func AppendAny(b []byte, v interface{}) []byte { func AppendAny(b []byte, v interface{}) []byte {
switch v := v.(type) { switch v := v.(type) {
case SimpleString:
b = AppendString(b, string(v))
case SimpleInt:
b = AppendInt(b, int64(v))
case nil: case nil:
b = AppendNull(b) b = AppendNull(b)
case error: case error:
b = AppendError(b, "ERR "+v.Error()) b = AppendError(b, prefixERRIfNeeded(v.Error()))
case string: case string:
b = AppendBulkString(b, v) b = AppendBulkString(b, v)
case []byte: case []byte:
b = AppendBulk(b, v) b = AppendBulk(b, v)
case bool: case bool:
if v { if v {
b = AppendInt(b, 1) b = AppendBulkString(b, "1")
} else { } else {
b = AppendInt(b, 0) b = AppendBulkString(b, "0")
} }
case int: case int:
b = AppendBulkInt(b, int64(v)) b = AppendBulkInt(b, int64(v))

View File

@ -61,12 +61,16 @@ type Conn interface {
// WriteRaw writes raw data to the client. // WriteRaw writes raw data to the client.
WriteRaw(data []byte) WriteRaw(data []byte)
// WriteAny writes any type to the client. // WriteAny writes any type to the client.
// nil -> null
// error -> error (adds "ERR " when first word is not uppercase)
// string -> bulk-string // string -> bulk-string
// numbers -> bulk-string // numbers -> bulk-string
// []byte -> bulk-string // []byte -> bulk-string
// bool -> number (0 or 1) // bool -> bulk-string ("0" or "1")
// slice -> array // slice -> array
// map -> array with key/value pairs // map -> array with key/value pairs
// SimpleString -> string
// SimpleInt -> integer
// everything-else -> bulk-string representation using fmt.Sprint() // everything-else -> bulk-string representation using fmt.Sprint()
WriteAny(any interface{}) WriteAny(any interface{})
// Context returns a user-defined context // Context returns a user-defined context
@ -644,12 +648,16 @@ func (w *Writer) WriteRaw(data []byte) {
} }
// WriteAny writes any type to client. // WriteAny writes any type to client.
// nil -> null
// error -> error (adds "ERR " when first word is not uppercase)
// string -> bulk-string // string -> bulk-string
// numbers -> bulk-string // numbers -> bulk-string
// []byte -> bulk-string // []byte -> bulk-string
// bool -> number (0 or 1) // bool -> bulk-string ("0" or "1")
// slice -> array // slice -> array
// map -> array with key/value pairs // map -> array with key/value pairs
// SimpleString -> string
// SimpleInt -> integer
// everything-else -> bulk-string representation using fmt.Sprint() // everything-else -> bulk-string representation using fmt.Sprint()
func (w *Writer) WriteAny(v interface{}) { func (w *Writer) WriteAny(v interface{}) {
w.b = AppendAny(w.b, v) w.b = AppendAny(w.b, v)