Files
sqlite3/internal/util/json.go

51 lines
907 B
Go
Raw Normal View History

2023-12-29 11:37:50 +00:00
package util
import (
"encoding/json"
2025-01-20 14:39:36 +00:00
"math"
2023-12-29 11:37:50 +00:00
"strconv"
"time"
"unsafe"
)
type JSON struct{ Value any }
func (j JSON) Scan(value any) error {
var buf []byte
switch v := value.(type) {
case []byte:
buf = v
case string:
buf = unsafe.Slice(unsafe.StringData(v), len(v))
case int64:
buf = strconv.AppendInt(nil, v, 10)
case float64:
2025-01-20 14:39:36 +00:00
buf = AppendNumber(nil, v)
2023-12-29 11:37:50 +00:00
case time.Time:
buf = append(buf, '"')
buf = v.AppendFormat(buf, time.RFC3339Nano)
buf = append(buf, '"')
case nil:
2024-06-11 22:57:29 +01:00
buf = []byte("null")
2023-12-29 11:37:50 +00:00
default:
panic(AssertErr())
}
return json.Unmarshal(buf, j.Value)
}
2025-01-20 14:39:36 +00:00
func AppendNumber(dst []byte, f float64) []byte {
switch {
case math.IsNaN(f):
dst = append(dst, "null"...)
case math.IsInf(f, 1):
dst = append(dst, "9.0e999"...)
case math.IsInf(f, -1):
dst = append(dst, "-9.0e999"...)
default:
return strconv.AppendFloat(dst, f, 'g', -1, 64)
}
return dst
}