1
0
Fork 0
pgpoint/point.go

56 lines
975 B
Go

package point
import (
"bytes"
"database/sql/driver"
"errors"
"fmt"
"strconv"
_ "github.com/lib/pq"
)
type Point struct {
Lat, Lng float64
}
func (p Point) Value() (driver.Value, error) {
tuple := fmt.Sprintf("(%f, %f)", p.Lat, p.Lng)
return driver.Value([]byte(tuple)), nil
}
func (p *Point) Scan(src interface{}) error {
var source []byte
var err error
switch src.(type) {
case string:
source = []byte(src.(string))
case []byte:
source = src.([]byte)
default:
return errors.New("Incompatible type for Point")
}
lp := bytes.IndexRune(source, '(')
c := bytes.IndexRune(source, ',')
rp := bytes.IndexRune(source, ')')
if lp == -1 || c == -1 || rp == -1 {
return fmt.Errorf(
"incorrect format from pg for Point: %s",
source,
)
}
p.Lat, err = strconv.ParseFloat(string(source[lp+1:c]), 64)
if err != nil {
return err
}
p.Lng, err = strconv.ParseFloat(string(source[c+1:rp]), 64)
if err != nil {
return err
}
return nil
}