diff --git a/values.go b/values.go index 273fa68..0c8500f 100644 --- a/values.go +++ b/values.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "strconv" "strings" ) @@ -23,8 +24,10 @@ func readValue(b []byte) (value, error) { switch b[0] { case start_string: return readString(b[1:]) - case start_error: - return readError(b[1:]) + case start_error: + return readError(b[1:]) + case start_integer: + return readInteger(b[1:]) default: return nil, fmt.Errorf("unable to read redis protocol value: illegal start character: %c", b[0]) } @@ -43,15 +46,17 @@ func readString(b []byte) (value, error) { type Error string func readError(b []byte) (value, error) { - return Error(strings.Trim(string(b), "\r\n")), nil + return Error(strings.Trim(string(b), "\r\n")), nil } +// ------------------------------------------------------------------------------ +type Integer int64 - - - - - - - +func readInteger(b []byte) (value, error) { + i, err := strconv.ParseInt(strings.Trim(string(b), "\r\n"), 10, 64) + if err != nil { + return nil, fmt.Errorf("unable to read integer in redis protocol format: %v", err) + } + return Integer(i), nil +} diff --git a/values_test.go b/values_test.go index 420e175..c6b3d85 100644 --- a/values_test.go +++ b/values_test.go @@ -17,6 +17,14 @@ var valueTests = []struct { {"-one two", Error("one two")}, // intermediate space {"-one two ", Error("one two ")}, // trailing space {"- one two", Error(" one two")}, // leading space + + {":0", Integer(0)}, + {":1", Integer(1)}, + {":-1", Integer(-1)}, + {":12345", Integer(12345)}, + {":-12345", Integer(-12345)}, + {":9223372036854775807", Integer(9223372036854775807)}, // int64 max + {":-9223372036854775808", Integer(-9223372036854775808)}, // int64 min } func TestValues(t *testing.T) {