package dts import ( "database/sql" "database/sql/driver" "encoding/json" ) // NullString represents a string that may be null. // NullString implements the [Scanner] interface so // it can be used as a scan destination: // // var s NullString // err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s) // ... // if s.Valid { // // use s.String // } else { // // NULL value // } type NullString struct { String string Valid bool // Valid is true if String is not NULL } // Scan implements the Scanner interface. func (ns *NullString) Scan(value any) error { if value == nil { ns.String, ns.Valid = "", false return nil } ss := new(sql.NullString) err := ss.Scan(value) ns.String = ss.String ns.Valid = ss.Valid return err } // Value implements the driver Valuer interface. func (ns NullString) Value() (driver.Value, error) { if !ns.Valid { return nil, nil } return ns.String, nil } func (ns NullString) MarshalJSON() ([]byte, error) { if ns.Valid { return json.Marshal(ns.String) } return json.Marshal(nil) } func (ns *NullString) UnmarshalJSON(b []byte) error { if string(b) == "null" { ns.Valid = false return nil } err := json.Unmarshal(b, &ns.String) ns.Valid = err == nil return err }