mirror of
https://github.com/wader/fq.git
synced 2024-11-30 09:58:13 +03:00
8a468f45df
$ cat random.bin.gz | fq -rV -o bits_format=hex .uncompressed f6f2074cf77d449d Also made unknown bit formats an error.
101 lines
1.8 KiB
Go
101 lines
1.8 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 gojqex
|
|
|
|
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
|
|
default:
|
|
nv, err := valueFn(vv)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ToGoJQValueFn(nv, valueFn)
|
|
}
|
|
}
|