diff --git a/command.go b/command.go index d89eab65..8ac048ac 100644 --- a/command.go +++ b/command.go @@ -806,10 +806,6 @@ type GeoLocation struct { GeoHash int64 } -type GeoPosition struct { - Longitude, Latitude float64 -} - // GeoRadiusQuery is used with GeoRadius to query geospatial index. type GeoRadiusQuery struct { Radius float64 @@ -886,10 +882,16 @@ func (cmd *GeoLocationCmd) readReply(cn *pool.Conn) error { return nil } +//------------------------------------------------------------------------------ + +type GeoPos struct { + Longitude, Latitude float64 +} + type GeoPosCmd struct { baseCmd - positions []*GeoPosition + positions []*GeoPos } func NewGeoPosCmd(args ...interface{}) *GeoPosCmd { @@ -897,11 +899,11 @@ func NewGeoPosCmd(args ...interface{}) *GeoPosCmd { return &GeoPosCmd{baseCmd: cmd} } -func (cmd *GeoPosCmd) Val() []*GeoPosition { +func (cmd *GeoPosCmd) Val() []*GeoPos { return cmd.positions } -func (cmd *GeoPosCmd) Result() ([]*GeoPosition, error) { +func (cmd *GeoPosCmd) Result() ([]*GeoPos, error) { return cmd.Val(), cmd.Err() } @@ -915,12 +917,12 @@ func (cmd *GeoPosCmd) reset() { } func (cmd *GeoPosCmd) readReply(cn *pool.Conn) error { - reply, err := cn.Rd.ReadArrayReply(newGeoPositionSliceParser()) + reply, err := cn.Rd.ReadArrayReply(geoPosSliceParser) if err != nil { cmd.err = err return err } - cmd.positions = reply.([]*GeoPosition) + cmd.positions = reply.([]*GeoPos) return nil } diff --git a/commands.go b/commands.go index bcaeadad..3d3fe2f6 100644 --- a/commands.go +++ b/commands.go @@ -234,7 +234,7 @@ type Cmdable interface { ClusterAddSlots(slots ...int) *StatusCmd ClusterAddSlotsRange(min, max int) *StatusCmd GeoAdd(key string, geoLocation ...*GeoLocation) *IntCmd - GeoPos(key string, name ...string) *GeoPosCmd + GeoPos(key string, members ...string) *GeoPosCmd GeoRadius(key string, longitude, latitude float64, query *GeoRadiusQuery) *GeoLocationCmd GeoRadiusByMember(key, member string, query *GeoRadiusQuery) *GeoLocationCmd GeoDist(key string, member1, member2, unit string) *FloatCmd @@ -2055,12 +2055,12 @@ func (c *cmdable) GeoHash(key string, members ...string) *StringSliceCmd { return cmd } -func (c *cmdable) GeoPos(key string, names ...string) *GeoPosCmd { - args := make([]interface{}, 2+len(names)) +func (c *cmdable) GeoPos(key string, members ...string) *GeoPosCmd { + args := make([]interface{}, 2+len(members)) args[0] = "geopos" args[1] = key - for i, name := range names { - args[2+i] = name + for i, member := range members { + args[2+i] = member } cmd := NewGeoPosCmd(args...) c.process(cmd) diff --git a/parser.go b/parser.go index c1db8d0d..46220d40 100644 --- a/parser.go +++ b/parser.go @@ -273,46 +273,42 @@ func newGeoLocationSliceParser(q *GeoRadiusQuery) proto.MultiBulkParse { } } -func newGeoPositionParser() proto.MultiBulkParse { - return func(rd *proto.Reader, n int64) (interface{}, error) { - var pos GeoPosition - var err error +func geoPosParser(rd *proto.Reader, n int64) (interface{}, error) { + var pos GeoPos + var err error - pos.Longitude, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - pos.Latitude, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - - return &pos, nil + pos.Longitude, err = rd.ReadFloatReply() + if err != nil { + return nil, err } + + pos.Latitude, err = rd.ReadFloatReply() + if err != nil { + return nil, err + } + + return &pos, nil } -func newGeoPositionSliceParser() proto.MultiBulkParse { - return func(rd *proto.Reader, n int64) (interface{}, error) { - positions := make([]*GeoPosition, 0, n) - for i := int64(0); i < n; i++ { - v, err := rd.ReadReply(newGeoPositionParser()) - if err != nil { - // response may contain nil results - if err == Nil { - positions = append(positions, nil) - continue - } - return nil, err - } - switch vv := v.(type) { - case *GeoPosition: - positions = append(positions, vv) - default: - return nil, fmt.Errorf("got %T, expected *GeoPosition", v) +func geoPosSliceParser(rd *proto.Reader, n int64) (interface{}, error) { + positions := make([]*GeoPos, 0, n) + for i := int64(0); i < n; i++ { + v, err := rd.ReadReply(geoPosParser) + if err != nil { + if err == Nil { + positions = append(positions, nil) + continue } + return nil, err + } + switch v := v.(type) { + case *GeoPos: + positions = append(positions, v) + default: + return nil, fmt.Errorf("got %T, expected *GeoPos", v) } - return positions, nil } + return positions, nil } func commandInfoParser(rd *proto.Reader, n int64) (interface{}, error) {