You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
797 B
50 lines
797 B
package models
|
|
|
|
import (
|
|
"database/sql"
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
type scannableJSON struct {
|
|
v interface{}
|
|
}
|
|
|
|
func (s *scannableJSON) Scan(src interface{}) error {
|
|
if src == nil {
|
|
return nil
|
|
}
|
|
var data []byte
|
|
switch v := src.(type) {
|
|
case []byte:
|
|
data = v
|
|
case string:
|
|
data = []byte(v)
|
|
default:
|
|
return fmt.Errorf("unsupported type for JSON scan: %T", src)
|
|
}
|
|
return json.Unmarshal(data, s.v)
|
|
}
|
|
|
|
func tagsToJSON(tags []string) string {
|
|
if tags == nil {
|
|
return "[]"
|
|
}
|
|
b, _ := json.Marshal(tags)
|
|
return string(b)
|
|
}
|
|
|
|
func boolToInt(b bool) int {
|
|
if b {
|
|
return 1
|
|
}
|
|
return 0
|
|
}
|
|
|
|
var _ sql.Scanner = (*scannableJSON)(nil)
|
|
var _ driver.Valuer = (*scannableJSON)(nil)
|
|
|
|
func (s *scannableJSON) Value() (driver.Value, error) {
|
|
return json.Marshal(s.v)
|
|
}
|
|
|