72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
package xorm
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"reflect"
|
|
)
|
|
|
|
type NullString struct {
|
|
String string
|
|
Valid bool
|
|
}
|
|
|
|
func (ns NullString) Ptr() *string {
|
|
if !ns.Valid {
|
|
return nil
|
|
}
|
|
return &ns.String
|
|
}
|
|
|
|
func (ns NullString) ValueOrZero() string {
|
|
if !ns.Valid {
|
|
return ""
|
|
}
|
|
return ns.String
|
|
}
|
|
|
|
func (ns NullString) IsNil() bool {
|
|
return !ns.Valid
|
|
}
|
|
|
|
func (ns *NullString) UnmarshalJSON(data []byte) error {
|
|
var err error
|
|
var v interface{}
|
|
if err = json.Unmarshal(data, &v); err != nil {
|
|
return err
|
|
}
|
|
switch x := v.(type) {
|
|
case string:
|
|
ns.String = x
|
|
case map[string]interface{}:
|
|
err = json.Unmarshal(data, &ns)
|
|
case nil:
|
|
ns.Valid = false
|
|
return nil
|
|
default:
|
|
err = fmt.Errorf("json: cannot unmarshal %v into Go value of type xorm.NullString", reflect.TypeOf(v).Name())
|
|
}
|
|
ns.Valid = err == nil
|
|
return err
|
|
}
|
|
|
|
func (ns NullString) MarshalJSON() ([]byte, error) {
|
|
if !ns.Valid {
|
|
return []byte("null"), nil
|
|
}
|
|
return json.Marshal(ns.String)
|
|
}
|
|
|
|
func (ns NullString) MarshalText() ([]byte, error) {
|
|
if !ns.Valid {
|
|
return []byte{}, nil
|
|
}
|
|
return []byte(ns.String), nil
|
|
}
|
|
|
|
func (ns *NullString) UnmarshalText(text []byte) error {
|
|
ns.String = string(text)
|
|
ns.Valid = ns.String != ""
|
|
return nil
|
|
}
|