28 lines
555 B
Go
28 lines
555 B
Go
|
|
package model
|
||
|
|
|
||
|
|
import (
|
||
|
|
"database/sql/driver"
|
||
|
|
"encoding/json"
|
||
|
|
)
|
||
|
|
|
||
|
|
// ScanJSON scans a database value (nil, []byte, or string) into any JSON-unmarshalable pointer.
|
||
|
|
func ScanJSON[T any](ptr *T, value any) error {
|
||
|
|
if value == nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
var data []byte
|
||
|
|
switch v := value.(type) {
|
||
|
|
case []byte:
|
||
|
|
data = v
|
||
|
|
case string:
|
||
|
|
data = []byte(v)
|
||
|
|
default:
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
return json.Unmarshal(data, ptr)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ValueJSON marshals any value to JSON for database storage.
|
||
|
|
func ValueJSON[T any](val T) (driver.Value, error) {
|
||
|
|
return json.Marshal(val)
|
||
|
|
}
|