package pgtype
import (
)
type CircleScanner interface {
ScanCircle(v Circle) error
}
type CircleValuer interface {
CircleValue() (Circle, error)
}
type Circle struct {
P Vec2
R float64
Valid bool
}
func ( *Circle) ( Circle) error {
* =
return nil
}
func ( Circle) () (Circle, error) {
return , nil
}
func ( *Circle) ( any) error {
if == nil {
* = Circle{}
return nil
}
if , := .(string); {
return scanPlanTextAnyToCircleScanner{}.Scan([]byte(), )
}
return fmt.Errorf("cannot scan %T", )
}
func ( Circle) () (driver.Value, error) {
if !.Valid {
return nil, nil
}
, := CircleCodec{}.PlanEncode(nil, 0, TextFormatCode, ).Encode(, nil)
if != nil {
return nil,
}
return string(),
}
type CircleCodec struct{}
func (CircleCodec) ( int16) bool {
return == TextFormatCode || == BinaryFormatCode
}
func (CircleCodec) () int16 {
return BinaryFormatCode
}
func (CircleCodec) ( *Map, uint32, int16, any) EncodePlan {
if , := .(CircleValuer); ! {
return nil
}
switch {
case BinaryFormatCode:
return encodePlanCircleCodecBinary{}
case TextFormatCode:
return encodePlanCircleCodecText{}
}
return nil
}
type encodePlanCircleCodecBinary struct{}
func (encodePlanCircleCodecBinary) ( any, []byte) ( []byte, error) {
, := .(CircleValuer).CircleValue()
if != nil {
return nil,
}
if !.Valid {
return nil, nil
}
= pgio.AppendUint64(, math.Float64bits(.P.X))
= pgio.AppendUint64(, math.Float64bits(.P.Y))
= pgio.AppendUint64(, math.Float64bits(.R))
return , nil
}
type encodePlanCircleCodecText struct{}
func (encodePlanCircleCodecText) ( any, []byte) ( []byte, error) {
, := .(CircleValuer).CircleValue()
if != nil {
return nil,
}
if !.Valid {
return nil, nil
}
= append(, fmt.Sprintf(`<(%s,%s),%s>`,
strconv.FormatFloat(.P.X, 'f', -1, 64),
strconv.FormatFloat(.P.Y, 'f', -1, 64),
strconv.FormatFloat(.R, 'f', -1, 64),
)...)
return , nil
}
func (CircleCodec) ( *Map, uint32, int16, any) ScanPlan {
switch {
case BinaryFormatCode:
if , := .(CircleScanner); {
return scanPlanBinaryCircleToCircleScanner{}
}
case TextFormatCode:
if , := .(CircleScanner); {
return scanPlanTextAnyToCircleScanner{}
}
}
return nil
}
func ( CircleCodec) ( *Map, uint32, int16, []byte) (driver.Value, error) {
return codecDecodeToTextFormat(, , , , )
}
func ( CircleCodec) ( *Map, uint32, int16, []byte) (any, error) {
if == nil {
return nil, nil
}
var Circle
:= codecScan(, , , , , &)
if != nil {
return nil,
}
return , nil
}
type scanPlanBinaryCircleToCircleScanner struct{}
func (scanPlanBinaryCircleToCircleScanner) ( []byte, any) error {
:= ().(CircleScanner)
if == nil {
return .ScanCircle(Circle{})
}
if len() != 24 {
return fmt.Errorf("invalid length for Circle: %v", len())
}
:= binary.BigEndian.Uint64()
:= binary.BigEndian.Uint64([8:])
:= binary.BigEndian.Uint64([16:])
return .ScanCircle(Circle{
P: Vec2{math.Float64frombits(), math.Float64frombits()},
R: math.Float64frombits(),
Valid: true,
})
}
type scanPlanTextAnyToCircleScanner struct{}
func (scanPlanTextAnyToCircleScanner) ( []byte, any) error {
:= ().(CircleScanner)
if == nil {
return .ScanCircle(Circle{})
}
if len() < 9 {
return fmt.Errorf("invalid length for Circle: %v", len())
}
, := strings.CutPrefix(string(), "<(")
if ! {
return fmt.Errorf("invalid format for Circle")
}
, = strings.CutSuffix(, ">")
if ! {
return fmt.Errorf("invalid format for Circle")
}
, , := strings.Cut(, ",")
if ! {
return fmt.Errorf("invalid format for Circle")
}
, , := strings.Cut(, "),")
if ! {
return fmt.Errorf("invalid format for Circle")
}
, := strconv.ParseFloat(, 64)
if != nil {
return
}
, := strconv.ParseFloat(, 64)
if != nil {
return
}
, := strconv.ParseFloat(, 64)
if != nil {
return
}
return .ScanCircle(Circle{P: Vec2{, }, R: , Valid: true})
}