mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 04:32:26 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			907 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			907 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package util
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"math"
 | 
						|
	"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:
 | 
						|
		buf = AppendNumber(nil, v)
 | 
						|
	case time.Time:
 | 
						|
		buf = append(buf, '"')
 | 
						|
		buf = v.AppendFormat(buf, time.RFC3339Nano)
 | 
						|
		buf = append(buf, '"')
 | 
						|
	case nil:
 | 
						|
		buf = []byte("null")
 | 
						|
	default:
 | 
						|
		panic(AssertErr())
 | 
						|
	}
 | 
						|
 | 
						|
	return json.Unmarshal(buf, j.Value)
 | 
						|
}
 | 
						|
 | 
						|
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
 | 
						|
}
 |