123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- package xorm
- import (
- "encoding/json"
- "errors"
- "fmt"
- "reflect"
- )
- type NullBool struct {
- Bool bool
- Valid bool
- }
- func (nb NullBool) Ptr() *bool {
- if !nb.Valid {
- return nil
- }
- return &nb.Bool
- }
- func (nb NullBool) ValueOrZero() bool {
- if !nb.Valid {
- return false
- }
- return nb.Bool
- }
- func (nb NullBool) IsNil() bool {
- return !nb.Valid
- }
- func (nb *NullBool) 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 bool:
- nb.Bool = x
- case map[string]interface{}:
- err = json.Unmarshal(data, &nb)
- case nil:
- nb.Valid = false
- return nil
- default:
- err = fmt.Errorf("json: cannot unmarshal %v into Go value of type xorm.NullBool", reflect.TypeOf(v).Name())
- }
- nb.Valid = err == nil
- return err
- }
- func (nb *NullBool) UnmarshalText(text []byte) error {
- str := string(text)
- switch str {
- case "", "null":
- nb.Valid = false
- return nil
- case "true":
- nb.Bool = true
- case "false":
- nb.Bool = false
- default:
- nb.Valid = false
- return errors.New("invalid input:" + str)
- }
- nb.Valid = true
- return nil
- }
- func (nb NullBool) MarshalJSON() ([]byte, error) {
- if !nb.Valid {
- return []byte("null"), nil
- }
- if !nb.Bool {
- return []byte("false"), nil
- }
- return []byte("true"), nil
- }
- func (nb NullBool) MarshalText() ([]byte, error) {
- if !nb.Valid {
- return []byte{}, nil
- }
- if !nb.Bool {
- return []byte("false"), nil
- }
- return []byte("true"), nil
- }
|