1
1
mirror of https://github.com/wader/fq.git synced 2024-11-25 14:12:13 +03:00
fq/internal/gojqx/totype.go
Mattias Wadman bf7fa07c41 fq: Use go 1.20 and cleanup
Also rename *ex packages to *x
2024-04-01 19:14:10 +02:00

103 lines
1.9 KiB
Go

// Some of these functions are based on gojq func.go functions
// TODO: maybe should be exported from gojq fq branch instead?
// The MIT License (MIT)
// Copyright (c) 2019-2021 itchyny
package gojqx
import (
"fmt"
"math"
"math/big"
"github.com/wader/gojq"
)
func IsNull(x any) bool {
switch x := x.(type) {
case nil:
return true
case gojq.JQValue:
return IsNull(x.JQValueToGoJQ())
default:
return false
}
}
func ToGoJQValue(v any) (any, error) {
return ToGoJQValueFn(v, func(v any) (any, error) {
switch v := v.(type) {
case gojq.JQValue:
return v.JQValueToGoJQ(), nil
default:
return nil, fmt.Errorf("not a JQValue")
}
})
}
func ToGoJQValueFn(v any, valueFn func(v any) (any, error)) (any, error) {
switch vv := v.(type) {
case nil:
return vv, nil
case bool:
return vv, nil
case int:
return vv, nil
case int64:
if vv >= math.MinInt && vv <= math.MaxInt {
return int(vv), nil
}
return big.NewInt(vv), nil
case uint64:
if vv <= math.MaxInt {
return int(vv), nil
}
return new(big.Int).SetUint64(vv), nil
case float32:
return float64(vv), nil
case float64:
return vv, nil
case *big.Int:
if vv.IsInt64() {
vv := vv.Int64()
if vv >= math.MinInt && vv <= math.MaxInt {
return int(vv), nil
}
}
return vv, nil
case string:
return vv, nil
case []byte:
return string(vv), nil
case []any:
vvs := make([]any, len(vv))
for i, v := range vv {
v, err := ToGoJQValueFn(v, valueFn)
if err != nil {
return nil, err
}
vvs[i] = v
}
return vvs, nil
case map[string]any:
vvs := make(map[string]any, len(vv))
for k, v := range vv {
v, err := ToGoJQValueFn(v, valueFn)
if err != nil {
return nil, err
}
vvs[k] = v
}
return vvs, nil
case error:
return nil, vv
default:
nv, err := valueFn(vv)
if err != nil {
return nil, err
}
return ToGoJQValueFn(nv, valueFn)
}
}