package pgtype
import (
"database/sql/driver"
"encoding/json"
"fmt"
)
type Text struct {
String string
Status Status
}
func (dst *Text ) Set (src interface {}) error {
if src == nil {
*dst = Text {Status : Null }
return nil
}
if value , ok := src .(interface { Get () interface {} }); ok {
value2 := value .Get ()
if value2 != value {
return dst .Set (value2 )
}
}
switch value := src .(type ) {
case string :
*dst = Text {String : value , Status : Present }
case *string :
if value == nil {
*dst = Text {Status : Null }
} else {
*dst = Text {String : *value , Status : Present }
}
case []byte :
if value == nil {
*dst = Text {Status : Null }
} else {
*dst = Text {String : string (value ), Status : Present }
}
default :
if originalSrc , ok := underlyingStringType (src ); ok {
return dst .Set (originalSrc )
}
return fmt .Errorf ("cannot convert %v to Text" , value )
}
return nil
}
func (dst Text ) Get () interface {} {
switch dst .Status {
case Present :
return dst .String
case Null :
return nil
default :
return dst .Status
}
}
func (src *Text ) AssignTo (dst interface {}) error {
switch src .Status {
case Present :
switch v := dst .(type ) {
case *string :
*v = src .String
return nil
case *[]byte :
*v = make ([]byte , len (src .String ))
copy (*v , src .String )
return nil
default :
if nextDst , retry := GetAssignToDstType (dst ); retry {
return src .AssignTo (nextDst )
}
return fmt .Errorf ("unable to assign to %T" , dst )
}
case Null :
return NullAssignTo (dst )
}
return fmt .Errorf ("cannot decode %#v into %T" , src , dst )
}
func (Text ) PreferredResultFormat () int16 {
return TextFormatCode
}
func (dst *Text ) DecodeText (ci *ConnInfo , src []byte ) error {
if src == nil {
*dst = Text {Status : Null }
return nil
}
*dst = Text {String : string (src ), Status : Present }
return nil
}
func (dst *Text ) DecodeBinary (ci *ConnInfo , src []byte ) error {
return dst .DecodeText (ci , src )
}
func (Text ) PreferredParamFormat () int16 {
return TextFormatCode
}
func (src Text ) EncodeText (ci *ConnInfo , buf []byte ) ([]byte , error ) {
switch src .Status {
case Null :
return nil , nil
case Undefined :
return nil , errUndefined
}
return append (buf , src .String ...), nil
}
func (src Text ) EncodeBinary (ci *ConnInfo , buf []byte ) ([]byte , error ) {
return src .EncodeText (ci , buf )
}