Move everything to better package structure
This commit is contained in:
parent
f6b4d3c6fd
commit
5149df8359
40 changed files with 241 additions and 86 deletions
types
77
types/json.go
Normal file
77
types/json.go
Normal file
|
@ -0,0 +1,77 @@
|
|||
package types
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
)
|
||||
|
||||
// JSON is an alias for json.RawMessage, which is
|
||||
// a []byte underneath.
|
||||
// JSON implements Marshal and Unmarshal.
|
||||
type JSON json.RawMessage
|
||||
|
||||
// String output your JSON.
|
||||
func (j JSON) String() string {
|
||||
return string(j)
|
||||
}
|
||||
|
||||
// Unmarshal your JSON variable into dest.
|
||||
func (j JSON) Unmarshal(dest interface{}) error {
|
||||
return json.Unmarshal(j, dest)
|
||||
}
|
||||
|
||||
// Marshal obj into your JSON variable.
|
||||
func (j *JSON) Marshal(obj interface{}) error {
|
||||
res, err := json.Marshal(obj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
*j = res
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnmarshalJSON sets *j to a copy of data.
|
||||
func (j *JSON) UnmarshalJSON(data []byte) error {
|
||||
if j == nil {
|
||||
return errors.New("JSON: UnmarshalJSON on nil pointer")
|
||||
}
|
||||
|
||||
*j = append((*j)[0:0], data...)
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalJSON returns j as the JSON encoding of j.
|
||||
func (j JSON) MarshalJSON() ([]byte, error) {
|
||||
return j, nil
|
||||
}
|
||||
|
||||
// Value returns j as a value.
|
||||
// Unmarshal into RawMessage for validation.
|
||||
func (j JSON) Value() (driver.Value, error) {
|
||||
var r json.RawMessage
|
||||
if err := j.Unmarshal(&r); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return []byte(r), nil
|
||||
}
|
||||
|
||||
// Scan stores the src in *j.
|
||||
func (j *JSON) Scan(src interface{}) error {
|
||||
var source []byte
|
||||
|
||||
switch src.(type) {
|
||||
case string:
|
||||
source = []byte(src.(string))
|
||||
case []byte:
|
||||
source = src.([]byte)
|
||||
default:
|
||||
return errors.New("Incompatible type for JSON")
|
||||
}
|
||||
|
||||
*j = JSON(append((*j)[0:0], source...))
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue