1
0
mirror of https://github.com/writeas/web-core synced 2018-07-20 11:55:21 +00:00

Add JSON and SQL converters for gorilla/schema

This commit is contained in:
Matt Baer 2018-03-27 22:08:02 -04:00
parent b150adf2e1
commit e994cb9bf8
2 changed files with 124 additions and 0 deletions

82
converter/json.go Normal file
View File

@ -0,0 +1,82 @@
package converter
import (
"database/sql"
"encoding/json"
"reflect"
)
type NullJSONBool struct {
sql.NullBool
}
func JSONNullBool(value string) reflect.Value {
v := NullJSONBool{}
if value == "on" || value == "off" {
return reflect.ValueOf(NullJSONBool{sql.NullBool{Bool: value == "on", Valid: true}})
}
if err := v.Scan(value); err != nil {
return reflect.Value{}
}
return reflect.ValueOf(v)
}
func (v NullJSONBool) MarshalJSON() ([]byte, error) {
if v.Valid {
return json.Marshal(v.Bool)
} else {
return json.Marshal(nil)
}
}
func (v *NullJSONBool) UnmarshalJSON(data []byte) error {
// Unmarshalling into a pointer will let us detect null
var x *bool
if err := json.Unmarshal(data, &x); err != nil {
return err
}
if x != nil {
v.Valid = true
v.Bool = *x
} else {
v.Valid = false
}
return nil
}
type NullJSONString struct {
sql.NullString
}
func JSONNullString(value string) reflect.Value {
v := NullJSONString{}
if err := v.Scan(value); err != nil {
return reflect.Value{}
}
return reflect.ValueOf(v)
}
func (v NullJSONString) MarshalJSON() ([]byte, error) {
if v.Valid {
return json.Marshal(v.String)
} else {
return json.Marshal(nil)
}
}
func (v *NullJSONString) UnmarshalJSON(data []byte) error {
// Unmarshalling into a pointer will let us detect null
var x *string
if err := json.Unmarshal(data, &x); err != nil {
return err
}
if x != nil {
v.Valid = true
v.String = *x
} else {
v.Valid = false
}
return nil
}

42
converter/sql.go Normal file
View File

@ -0,0 +1,42 @@
package converter
import (
"database/sql"
"reflect"
)
func SQLNullString(value string) reflect.Value {
v := sql.NullString{}
if err := v.Scan(value); err != nil {
return reflect.Value{}
}
return reflect.ValueOf(v)
}
func SQLNullBool(value string) reflect.Value {
v := sql.NullBool{}
if err := v.Scan(value); err != nil {
return reflect.Value{}
}
return reflect.ValueOf(v)
}
func SQLNullInt64(value string) reflect.Value {
v := sql.NullInt64{}
if err := v.Scan(value); err != nil {
return reflect.Value{}
}
return reflect.ValueOf(v)
}
func SQLNullFloat64(value string) reflect.Value {
v := sql.NullFloat64{}
if err := v.Scan(value); err != nil {
return reflect.Value{}
}
return reflect.ValueOf(v)
}