1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
package interp
import (
"bytes"
"fmt"
"math/big"
"strconv"
"strings"
"github.com/wader/fq/internal/mathex"
"github.com/wader/fq/internal/stringsex"
"github.com/wader/fq/pkg/bitio"
"github.com/wader/fq/pkg/scalar"
)
func previewValue(v any, df scalar.DisplayFormat) string {
switch vv := v.(type) {
case bool:
if vv {
return "true"
}
return "false"
case int:
// TODO: DisplayFormat is weird
return mathex.PadFormatInt(int64(vv), df.FormatBase(), true, 0)
case int64:
// TODO: DisplayFormat is weird
return mathex.PadFormatInt(vv, df.FormatBase(), true, 0)
case uint64:
return mathex.PadFormatUint(vv, df.FormatBase(), true, 0)
case float64:
// TODO: float32? better truncated to significant digits?
return strconv.FormatFloat(vv, 'g', -1, 64)
case string:
s := strconv.Quote(stringsex.TrimN(vv, 50, "..."))
// TODO: hack for https://github.com/golang/go/issues/52062
// 0x7f used to be escaped as \u007f in 1.18 and lower, was changed to \x7f
// remove once 1.18 is not supported
if !bytes.Contains([]byte(s), []byte{0x7f}) {
return s
}
return strings.ReplaceAll(s, `\u007f`, `\x7f`)
case nil:
return "null"
case bitio.Reader,
Binary:
return "raw bits"
case *big.Int:
return mathex.PadFormatBigInt(vv, df.FormatBase(), true, 0)
case map[string]any:
return "{}"
case []any:
return "[]"
default:
panic(fmt.Sprintf("unreachable %v (%T)", v, v))
}
}
|