package pgtype

import (
	
	
	
	
	
	
	

	
)

type Vec2 struct {
	X float64
	Y float64
}

type Point struct {
	P      Vec2
	Status Status
}

func ( *Point) ( interface{}) error {
	if  == nil {
		.Status = Null
		return nil
	}
	 := fmt.Errorf("cannot convert %v to Point", )
	var  *Point
	switch value := .(type) {
	case string:
		,  = parsePoint([]byte())
	case []byte:
		,  = parsePoint()
	default:
		return 
	}
	if  != nil {
		return 
	}
	* = *
	return nil
}

func ( []byte) (*Point, error) {
	if  == nil || bytes.Compare(, []byte("null")) == 0 {
		return &Point{Status: Null}, nil
	}

	if len() < 5 {
		return nil, fmt.Errorf("invalid length for point: %v", len())
	}
	if [0] == '"' && [len()-1] == '"' {
		 = [1 : len()-1]
	}
	 := strings.SplitN(string([1:len()-1]), ",", 2)
	if len() < 2 {
		return nil, fmt.Errorf("invalid format for point")
	}

	,  := strconv.ParseFloat([0], 64)
	if  != nil {
		return nil, 
	}

	,  := strconv.ParseFloat([1], 64)
	if  != nil {
		return nil, 
	}

	return &Point{P: Vec2{, }, Status: Present}, nil
}

func ( Point) () interface{} {
	switch .Status {
	case Present:
		return 
	case Null:
		return nil
	default:
		return .Status
	}
}

func ( *Point) ( interface{}) error {
	return fmt.Errorf("cannot assign %v to %T", , )
}

func ( *Point) ( *ConnInfo,  []byte) error {
	if  == nil {
		* = Point{Status: Null}
		return nil
	}

	if len() < 5 {
		return fmt.Errorf("invalid length for point: %v", len())
	}

	 := strings.SplitN(string([1:len()-1]), ",", 2)
	if len() < 2 {
		return fmt.Errorf("invalid format for point")
	}

	,  := strconv.ParseFloat([0], 64)
	if  != nil {
		return 
	}

	,  := strconv.ParseFloat([1], 64)
	if  != nil {
		return 
	}

	* = Point{P: Vec2{, }, Status: Present}
	return nil
}

func ( *Point) ( *ConnInfo,  []byte) error {
	if  == nil {
		* = Point{Status: Null}
		return nil
	}

	if len() != 16 {
		return fmt.Errorf("invalid length for point: %v", len())
	}

	 := binary.BigEndian.Uint64()
	 := binary.BigEndian.Uint64([8:])

	* = Point{
		P:      Vec2{math.Float64frombits(), math.Float64frombits()},
		Status: Present,
	}
	return nil
}

func ( Point) ( *ConnInfo,  []byte) ([]byte, error) {
	switch .Status {
	case Null:
		return nil, nil
	case Undefined:
		return nil, errUndefined
	}

	return append(, fmt.Sprintf(`(%s,%s)`,
		strconv.FormatFloat(.P.X, 'f', -1, 64),
		strconv.FormatFloat(.P.Y, 'f', -1, 64),
	)...), nil
}

func ( Point) ( *ConnInfo,  []byte) ([]byte, error) {
	switch .Status {
	case Null:
		return nil, nil
	case Undefined:
		return nil, errUndefined
	}

	 = pgio.AppendUint64(, math.Float64bits(.P.X))
	 = pgio.AppendUint64(, math.Float64bits(.P.Y))
	return , nil
}
Scan implements the database/sql Scanner interface.
func ( *Point) ( interface{}) error {
	if  == nil {
		* = Point{Status: Null}
		return nil
	}

	switch src := .(type) {
	case string:
		return .DecodeText(nil, []byte())
	case []byte:
		 := make([]byte, len())
		copy(, )
		return .DecodeText(nil, )
	}

	return fmt.Errorf("cannot scan %T", )
}
Value implements the database/sql/driver Valuer interface.
func ( Point) () (driver.Value, error) {
	return EncodeValueText()
}

func ( Point) () ([]byte, error) {
	switch .Status {
	case Present:
		var  bytes.Buffer
		.WriteByte('"')
		.WriteString(fmt.Sprintf("(%g,%g)", .P.X, .P.Y))
		.WriteByte('"')
		return .Bytes(), nil
	case Null:
		return []byte("null"), nil
	case Undefined:
		return nil, errUndefined
	}
	return nil, errBadStatus
}

func ( *Point) ( []byte) error {
	,  := parsePoint()
	if  != nil {
		return 
	}
	* = *
	return nil