blob: 7b2e4e1d803beb281ba6f014adc1b7e284686bb1 [file] [log] [blame]
// Code generated by go generate. DO NOT EDIT.
package cue
import (
"bytes"
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"encoding/base64"
"encoding/csv"
"encoding/hex"
"encoding/json"
"fmt"
"html"
"io"
"math"
"math/big"
"math/bits"
"net"
"path"
"regexp"
"sort"
"strconv"
"strings"
"text/tabwriter"
"text/template"
"time"
"unicode"
"unicode/utf8"
"github.com/cockroachdb/apd/v2"
goyaml "github.com/ghodss/yaml"
"golang.org/x/net/idna"
"cuelang.org/go/cue/errors"
"cuelang.org/go/cue/literal"
"cuelang.org/go/cue/parser"
"cuelang.org/go/internal"
"cuelang.org/go/internal/third_party/yaml"
)
func init() {
initBuiltins(builtinPackages)
}
var _ io.Reader
var roundTruncContext = apd.Context{Rounding: apd.RoundDown}
var roundUpContext = apd.Context{Rounding: apd.RoundHalfUp}
var roundEvenContext = apd.Context{Rounding: apd.RoundHalfEven}
var mulContext = apd.BaseContext.WithPrecision(1)
var apdContext = apd.BaseContext.WithPrecision(24)
var zero = apd.New(0, 0)
var two = apd.New(2, 0)
var idnaProfile = idna.New(
idna.ValidateLabels(true),
idna.VerifyDNSLength(true),
idna.StrictDomainName(true),
)
func netGetIP(ip Value) (goip net.IP) {
switch ip.Kind() {
case StringKind:
s, err := ip.String()
if err != nil {
return nil
}
goip := net.ParseIP(s)
if goip == nil {
return nil
}
return goip
case BytesKind:
b, err := ip.Bytes()
if err != nil {
return nil
}
goip := net.ParseIP(string(b))
if goip == nil {
return nil
}
return goip
case ListKind:
iter, err := ip.List()
if err != nil {
return nil
}
for iter.Next() {
v, err := iter.Value().Int64()
if err != nil {
return nil
}
if v < 0 || 255 < v {
return nil
}
goip = append(goip, byte(v))
}
return goip
default:
return nil
}
}
func netToList(ip net.IP) []uint {
a := make([]uint, len(ip))
for i, p := range ip {
a[i] = uint(p)
}
return a
}
var split = path.Split
var pathClean = path.Clean
var pathExt = path.Ext
var pathBase = path.Base
var pathIsAbs = path.IsAbs
var pathDir = path.Dir
var errNoMatch = errors.New("no match")
var errNoNamedGroup = errors.New("no named groups")
func timeFormat(value, layout string) (bool, error) {
_, err := time.Parse(layout, value)
if err != nil {
return false, fmt.Errorf("invalid time %q", value)
}
return true, nil
}
var boolValues = map[string]bool{
"1": true,
"0": false,
"t": true,
"f": false,
"T": true,
"F": false,
"true": true,
"false": false,
"TRUE": true,
"FALSE": false,
"True": true,
"False": false,
}
var builtinPackages = map[string]*builtinPkg{
"": {
native: []*builtin{{}},
},
"crypto/md5": {
native: []*builtin{{
Name: "Size",
Const: "16",
}, {
Name: "BlockSize",
Const: "64",
}, {
Name: "Sum",
Params: []kind{bytesKind | stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
a := md5.Sum(data)
return a[:]
}()
}
},
}},
},
"crypto/sha1": {
native: []*builtin{{
Name: "Size",
Const: "20",
}, {
Name: "BlockSize",
Const: "64",
}, {
Name: "Sum",
Params: []kind{bytesKind | stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
a := sha1.Sum(data)
return a[:]
}()
}
},
}},
},
"crypto/sha256": {
native: []*builtin{{
Name: "Size",
Const: "32",
}, {
Name: "Size224",
Const: "28",
}, {
Name: "BlockSize",
Const: "64",
}, {
Name: "Sum256",
Params: []kind{bytesKind | stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
a := sha256.Sum256(data)
return a[:]
}()
}
},
}, {
Name: "Sum224",
Params: []kind{bytesKind | stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
a := sha256.Sum224(data)
return a[:]
}()
}
},
}},
},
"crypto/sha512": {
native: []*builtin{{
Name: "Size",
Const: "64",
}, {
Name: "Size224",
Const: "28",
}, {
Name: "Size256",
Const: "32",
}, {
Name: "Size384",
Const: "48",
}, {
Name: "BlockSize",
Const: "128",
}, {
Name: "Sum512",
Params: []kind{bytesKind | stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
a := sha512.Sum512(data)
return a[:]
}()
}
},
}, {
Name: "Sum384",
Params: []kind{bytesKind | stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
a := sha512.Sum384(data)
return a[:]
}()
}
},
}, {
Name: "Sum512_224",
Params: []kind{bytesKind | stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
a := sha512.Sum512_224(data)
return a[:]
}()
}
},
}, {
Name: "Sum512_256",
Params: []kind{bytesKind | stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
a := sha512.Sum512_256(data)
return a[:]
}()
}
},
}},
},
"encoding/base64": {
native: []*builtin{{
Name: "EncodedLen",
Params: []kind{topKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
encoding, n := c.value(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if err := encoding.Null(); err != nil {
return 0, fmt.Errorf("base64: unsupported encoding: %v", err)
}
return base64.StdEncoding.EncodedLen(n), nil
}()
}
},
}, {
Name: "DecodedLen",
Params: []kind{topKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
encoding, x := c.value(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if err := encoding.Null(); err != nil {
return 0, fmt.Errorf("base64: unsupported encoding: %v", err)
}
return base64.StdEncoding.DecodedLen(x), nil
}()
}
},
}, {
Name: "Encode",
Params: []kind{topKind, bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
encoding, src := c.value(0), c.bytes(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if err := encoding.Null(); err != nil {
return "", fmt.Errorf("base64: unsupported encoding: %v", err)
}
return base64.StdEncoding.EncodeToString(src), nil
}()
}
},
}, {
Name: "Decode",
Params: []kind{topKind, stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
encoding, s := c.value(0), c.string(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if err := encoding.Null(); err != nil {
return nil, fmt.Errorf("base64: unsupported encoding: %v", err)
}
return base64.StdEncoding.DecodeString(s)
}()
}
},
}},
},
"encoding/csv": {
native: []*builtin{{
Name: "Encode",
Params: []kind{topKind},
Result: stringKind,
Func: func(c *callCtxt) {
x := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
buf := &bytes.Buffer{}
w := csv.NewWriter(buf)
iter, err := x.List()
if err != nil {
return "", err
}
for iter.Next() {
row, err := iter.Value().List()
if err != nil {
return "", err
}
a := []string{}
for row.Next() {
col := row.Value()
if str, err := col.String(); err == nil {
a = append(a, str)
} else {
b, err := col.MarshalJSON()
if err != nil {
return "", err
}
a = append(a, string(b))
}
}
_ = w.Write(a)
}
w.Flush()
return buf.String(), nil
}()
}
},
}, {
Name: "Decode",
Params: []kind{bytesKind | stringKind},
Result: listKind,
Func: func(c *callCtxt) {
r := c.reader(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return csv.NewReader(r).ReadAll()
}()
}
},
}},
},
"encoding/hex": {
native: []*builtin{{
Name: "EncodedLen",
Params: []kind{intKind},
Result: intKind,
Func: func(c *callCtxt) {
n := c.int(0)
if c.do() {
c.ret = func() interface{} {
return hex.EncodedLen(n)
}()
}
},
}, {
Name: "DecodedLen",
Params: []kind{intKind},
Result: intKind,
Func: func(c *callCtxt) {
x := c.int(0)
if c.do() {
c.ret = func() interface{} {
return hex.DecodedLen(x)
}()
}
},
}, {
Name: "Decode",
Params: []kind{stringKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return hex.DecodeString(s)
}()
}
},
}, {
Name: "Dump",
Params: []kind{bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
return hex.Dump(data)
}()
}
},
}, {
Name: "Encode",
Params: []kind{bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
return hex.EncodeToString(src)
}()
}
},
}},
},
"encoding/json": {
native: []*builtin{{
Name: "Valid",
Params: []kind{bytesKind | stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
return json.Valid(data)
}()
}
},
}, {
Name: "Compact",
Params: []kind{bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
dst := bytes.Buffer{}
if err := json.Compact(&dst, src); err != nil {
return "", err
}
return dst.String(), nil
}()
}
},
}, {
Name: "Indent",
Params: []kind{bytesKind | stringKind, stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
src, prefix, indent := c.bytes(0), c.string(1), c.string(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
dst := bytes.Buffer{}
if err := json.Indent(&dst, src, prefix, indent); err != nil {
return "", err
}
return dst.String(), nil
}()
}
},
}, {
Name: "HTMLEscape",
Params: []kind{bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
if c.do() {
c.ret = func() interface{} {
dst := &bytes.Buffer{}
json.HTMLEscape(dst, src)
return dst.String()
}()
}
},
}, {
Name: "Marshal",
Params: []kind{topKind},
Result: stringKind,
Func: func(c *callCtxt) {
v := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
b, err := json.Marshal(v)
return string(b), err
}()
}
},
}, {
Name: "MarshalStream",
Params: []kind{topKind},
Result: stringKind,
Func: func(c *callCtxt) {
v := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
iter, err := v.List()
if err != nil {
return "", err
}
buf := &bytes.Buffer{}
for iter.Next() {
b, err := json.Marshal(iter.Value())
if err != nil {
return "", err
}
buf.Write(b)
buf.WriteByte('\n')
}
return buf.String(), nil
}()
}
},
}, {
Name: "Unmarshal",
Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
b := c.bytes(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if !json.Valid(b) {
return nil, fmt.Errorf("json: invalid JSON")
}
expr, err := parser.ParseExpr("json", b)
if err != nil {
return nil, fmt.Errorf("json: could not parse JSON: %v", err)
}
return expr, nil
}()
}
},
}, {
Name: "Validate",
Params: []kind{bytesKind | stringKind, topKind},
Result: boolKind,
Func: func(c *callCtxt) {
b, v := c.bytes(0), c.value(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if !json.Valid(b) {
return false, fmt.Errorf("json: invalid JSON")
}
r := internal.GetRuntime(v).(*Runtime)
inst, err := r.Compile("json.Validate", b)
if err != nil {
return false, err
}
v = v.Unify(inst.Value())
if v.Err() != nil {
return false, v.Err()
}
return true, nil
}()
}
},
}},
},
"encoding/yaml": {
native: []*builtin{{
Name: "Marshal",
Params: []kind{topKind},
Result: stringKind,
Func: func(c *callCtxt) {
v := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
b, err := goyaml.Marshal(v)
return string(b), err
}()
}
},
}, {
Name: "MarshalStream",
Params: []kind{topKind},
Result: stringKind,
Func: func(c *callCtxt) {
v := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
iter, err := v.List()
if err != nil {
return "", err
}
buf := &bytes.Buffer{}
for i := 0; iter.Next(); i++ {
if i > 0 {
buf.WriteString("---\n")
}
b, err := goyaml.Marshal(iter.Value())
if err != nil {
return "", err
}
buf.Write(b)
}
return buf.String(), nil
}()
}
},
}, {
Name: "Unmarshal",
Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return yaml.Unmarshal("", data)
}()
}
},
}, {
Name: "Validate",
Params: []kind{bytesKind | stringKind, topKind},
Result: boolKind,
Func: func(c *callCtxt) {
b, v := c.bytes(0), c.value(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
d, err := yaml.NewDecoder("yaml.Validate", b)
if err != nil {
return false, err
}
r := internal.GetRuntime(v).(*Runtime)
for {
expr, err := d.Decode()
if err != nil {
if err == io.EOF {
return true, nil
}
return false, err
}
inst, err := r.CompileExpr(expr)
if err != nil {
return false, err
}
if err := v.Subsume(inst.Value(), Final()); err != nil {
return false, err
}
}
}()
}
},
}, {
Name: "ValidatePartial",
Params: []kind{bytesKind | stringKind, topKind},
Result: boolKind,
Func: func(c *callCtxt) {
b, v := c.bytes(0), c.value(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
d, err := yaml.NewDecoder("yaml.ValidatePartial", b)
if err != nil {
return false, err
}
r := internal.GetRuntime(v).(*Runtime)
for {
expr, err := d.Decode()
if err != nil {
if err == io.EOF {
return true, nil
}
return false, err
}
inst, err := r.CompileExpr(expr)
if err != nil {
return false, err
}
if x := v.Unify(inst.Value()); x.Err() != nil {
return false, x.Err()
}
}
}()
}
},
}},
},
"html": {
native: []*builtin{{
Name: "Escape",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return html.EscapeString(s)
}()
}
},
}, {
Name: "Unescape",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return html.UnescapeString(s)
}()
}
},
}},
},
"list": {
native: []*builtin{{
Name: "Drop",
Params: []kind{listKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
x, n := c.list(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if n < 0 {
return nil, fmt.Errorf("negative index")
}
if n > len(x) {
return []Value{}, nil
}
return x[n:], nil
}()
}
},
}, {
Name: "FlattenN",
Params: []kind{topKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
xs, depth := c.value(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var flattenN func(Value, int) ([]Value, error)
flattenN = func(xs Value, depth int) ([]Value, error) {
var res []Value
iter, err := xs.List()
if err != nil {
return nil, err
}
for iter.Next() {
val, _ := iter.Value().Default()
if val.Kind() == ListKind && depth != 0 {
d := depth - 1
values, err := flattenN(val, d)
if err != nil {
return nil, err
}
res = append(res, values...)
} else {
res = append(res, val)
}
}
return res, nil
}
return flattenN(xs, depth)
}()
}
},
}, {
Name: "Take",
Params: []kind{listKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
x, n := c.list(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if n < 0 {
return nil, fmt.Errorf("negative index")
}
if n > len(x) {
return x, nil
}
return x[:n], nil
}()
}
},
}, {
Name: "Slice",
Params: []kind{listKind, intKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
x, i, j := c.list(0), c.int(1), c.int(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if i < 0 {
return nil, fmt.Errorf("negative index")
}
if i > j {
return nil, fmt.Errorf("invalid index: %v > %v", i, j)
}
if i > len(x) {
return nil, fmt.Errorf("slice bounds out of range")
}
if j > len(x) {
return nil, fmt.Errorf("slice bounds out of range")
}
return x[i:j], nil
}()
}
},
}, {
Name: "MinItems",
Params: []kind{listKind, intKind},
Result: boolKind,
Func: func(c *callCtxt) {
a, n := c.list(0), c.int(1)
if c.do() {
c.ret = func() interface{} {
return len(a) >= n
}()
}
},
}, {
Name: "MaxItems",
Params: []kind{listKind, intKind},
Result: boolKind,
Func: func(c *callCtxt) {
a, n := c.list(0), c.int(1)
if c.do() {
c.ret = func() interface{} {
return len(a) <= n
}()
}
},
}, {
Name: "UniqueItems",
Params: []kind{listKind},
Result: boolKind,
Func: func(c *callCtxt) {
a := c.list(0)
if c.do() {
c.ret = func() interface{} {
b := []string{}
for _, v := range a {
b = append(b, fmt.Sprint(v))
}
sort.Strings(b)
for i := 1; i < len(b); i++ {
if b[i-1] == b[i] {
return false
}
}
return true
}()
}
},
}, {
Name: "Contains",
Params: []kind{listKind, topKind},
Result: boolKind,
Func: func(c *callCtxt) {
a, v := c.list(0), c.value(1)
if c.do() {
c.ret = func() interface{} {
for _, w := range a {
if v.Equals(w) {
return true
}
}
return false
}()
}
},
}, {
Name: "Avg",
Params: []kind{listKind},
Result: numKind,
Func: func(c *callCtxt) {
xs := c.decimalList(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if 0 == len(xs) {
return nil, fmt.Errorf("empty list")
}
s := apd.New(0, 0)
for _, x := range xs {
_, err := internal.BaseContext.Add(s, x, s)
if err != nil {
return nil, err
}
}
var d apd.Decimal
l := apd.New(int64(len(xs)), 0)
_, err := internal.BaseContext.Quo(&d, s, l)
if err != nil {
return nil, err
}
return &d, nil
}()
}
},
}, {
Name: "Max",
Params: []kind{listKind},
Result: numKind,
Func: func(c *callCtxt) {
xs := c.decimalList(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if 0 == len(xs) {
return nil, fmt.Errorf("empty list")
}
max := xs[0]
for _, x := range xs[1:] {
if -1 == max.Cmp(x) {
max = x
}
}
return max, nil
}()
}
},
}, {
Name: "Min",
Params: []kind{listKind},
Result: numKind,
Func: func(c *callCtxt) {
xs := c.decimalList(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if 0 == len(xs) {
return nil, fmt.Errorf("empty list")
}
min := xs[0]
for _, x := range xs[1:] {
if +1 == min.Cmp(x) {
min = x
}
}
return min, nil
}()
}
},
}, {
Name: "Product",
Params: []kind{listKind},
Result: numKind,
Func: func(c *callCtxt) {
xs := c.decimalList(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
d := apd.New(1, 0)
for _, x := range xs {
_, err := internal.BaseContext.Mul(d, x, d)
if err != nil {
return nil, err
}
}
return d, nil
}()
}
},
}, {
Name: "Range",
Params: []kind{numKind, numKind, numKind},
Result: listKind,
Func: func(c *callCtxt) {
start, limit, step := c.decimal(0), c.decimal(1), c.decimal(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if step.IsZero() {
return nil, fmt.Errorf("step must be non zero")
}
if !step.Negative && +1 == start.Cmp(limit) {
return nil, fmt.Errorf("end must be greater than start when step is positive")
}
if step.Negative && -1 == start.Cmp(limit) {
return nil, fmt.Errorf("end must be less than start when step is negative")
}
var vals []*internal.Decimal
num := start
for {
if !step.Negative && -1 != num.Cmp(limit) {
break
}
if step.Negative && +1 != num.Cmp(limit) {
break
}
vals = append(vals, num)
d := apd.New(0, 0)
_, err := internal.BaseContext.Add(d, step, num)
if err != nil {
return nil, err
}
num = d
}
return vals, nil
}()
}
},
}, {
Name: "Sum",
Params: []kind{listKind},
Result: numKind,
Func: func(c *callCtxt) {
xs := c.decimalList(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
d := apd.New(0, 0)
for _, x := range xs {
_, err := internal.BaseContext.Add(d, x, d)
if err != nil {
return nil, err
}
}
return d, nil
}()
}
},
}, {
Name: "Sort",
Params: []kind{listKind, topKind},
Result: listKind,
Func: func(c *callCtxt) {
list, cmp := c.list(0), c.value(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
s := valueSorter{list, cmp, nil}
sort.Sort(&s)
return s.ret()
}()
}
},
}, {
Name: "SortStable",
Params: []kind{listKind, topKind},
Result: listKind,
Func: func(c *callCtxt) {
list, cmp := c.list(0), c.value(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
s := valueSorter{list, cmp, nil}
sort.Stable(&s)
return s.ret()
}()
}
},
}, {
Name: "SortStrings",
Params: []kind{listKind},
Result: listKind,
Func: func(c *callCtxt) {
a := c.strList(0)
if c.do() {
c.ret = func() interface{} {
sort.Strings(a)
return a
}()
}
},
}, {
Name: "IsSorted",
Params: []kind{listKind, topKind},
Result: boolKind,
Func: func(c *callCtxt) {
list, cmp := c.list(0), c.value(1)
if c.do() {
c.ret = func() interface{} {
s := valueSorter{list, cmp, nil}
return sort.IsSorted(&s)
}()
}
},
}, {
Name: "IsSortedStrings",
Params: []kind{listKind},
Result: boolKind,
Func: func(c *callCtxt) {
a := c.strList(0)
if c.do() {
c.ret = func() interface{} {
return sort.StringsAreSorted(a)
}()
}
},
}},
cue: `{
Comparer :: {
T :: _
less: bool
x: T
y: T
}
Ascending :: {
T :: number | string
less: true && x < y
x: T
y: T
Comparer
}
Descending :: {
T :: number | string
less: x > y
x: T
y: T
Comparer
}
}`,
},
"math": {
native: []*builtin{{
Name: "MaxExp",
Const: "2147483647",
}, {
Name: "MinExp",
Const: "-2147483648",
}, {
Name: "MaxPrec",
Const: "4294967295",
}, {
Name: "ToNearestEven",
Const: "0",
}, {
Name: "ToNearestAway",
Const: "1",
}, {
Name: "ToZero",
Const: "2",
}, {
Name: "AwayFromZero",
Const: "3",
}, {
Name: "ToNegativeInf",
Const: "4",
}, {
Name: "ToPositiveInf",
Const: "5",
}, {
Name: "Below",
Const: "-1",
}, {
Name: "Exact",
Const: "0",
}, {
Name: "Above",
Const: "1",
}, {
Name: "Jacobi",
Params: []kind{intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
x, y := c.bigInt(0), c.bigInt(1)
if c.do() {
c.ret = func() interface{} {
return big.Jacobi(x, y)
}()
}
},
}, {
Name: "MaxBase",
Const: "62",
}, {
Name: "Floor",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Floor(&d, x)
return &d, err
}()
}
},
}, {
Name: "Ceil",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Ceil(&d, x)
return &d, err
}()
}
},
}, {
Name: "Trunc",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := roundTruncContext.RoundToIntegralExact(&d, x)
return &d, err
}()
}
},
}, {
Name: "Round",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := roundUpContext.RoundToIntegralExact(&d, x)
return &d, err
}()
}
},
}, {
Name: "RoundToEven",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := roundEvenContext.RoundToIntegralExact(&d, x)
return &d, err
}()
}
},
}, {
Name: "MultipleOf",
Params: []kind{numKind, numKind},
Result: boolKind,
Func: func(c *callCtxt) {
x, y := c.decimal(0), c.decimal(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d apd.Decimal
cond, err := mulContext.Quo(&d, x, y)
return !cond.Inexact(), err
}()
}
},
}, {
Name: "Abs",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Abs(&d, x)
return &d, err
}()
}
},
}, {
Name: "Acosh",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Acosh(x)
}()
}
},
}, {
Name: "Asin",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Asin(x)
}()
}
},
}, {
Name: "Acos",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Acos(x)
}()
}
},
}, {
Name: "Asinh",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Asinh(x)
}()
}
},
}, {
Name: "Atan",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Atan(x)
}()
}
},
}, {
Name: "Atan2",
Params: []kind{numKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
y, x := c.float64(0), c.float64(1)
if c.do() {
c.ret = func() interface{} {
return math.Atan2(y, x)
}()
}
},
}, {
Name: "Atanh",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Atanh(x)
}()
}
},
}, {
Name: "Cbrt",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Cbrt(&d, x)
return &d, err
}()
}
},
}, {
Name: "E",
Const: "2.71828182845904523536028747135266249775724709369995957496696763",
}, {
Name: "Pi",
Const: "3.14159265358979323846264338327950288419716939937510582097494459",
}, {
Name: "Phi",
Const: "1.61803398874989484820458683436563811772030917980576286213544861",
}, {
Name: "Sqrt2",
Const: "1.41421356237309504880168872420969807856967187537694807317667974",
}, {
Name: "SqrtE",
Const: "1.64872127070012814684865078781416357165377610071014801157507931",
}, {
Name: "SqrtPi",
Const: "1.77245385090551602729816748334114518279754945612238712821380779",
}, {
Name: "SqrtPhi",
Const: "1.27201964951406896425242246173749149171560804184009624861664038",
}, {
Name: "Ln2",
Const: "0.693147180559945309417232121458176568075500134360255254120680009",
}, {
Name: "Log2E",
Const: "1.442695040888963407359924681001892137426645954152985934135449408",
}, {
Name: "Ln10",
Const: "2.3025850929940456840179914546843642076011014886287729760333278",
}, {
Name: "Log10E",
Const: "0.43429448190325182765112891891660508229439700580366656611445378",
}, {
Name: "Copysign",
Params: []kind{numKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.decimal(0), c.decimal(1)
if c.do() {
c.ret = func() interface{} {
var d internal.Decimal
d.Set(x)
d.Negative = y.Negative
return &d
}()
}
},
}, {
Name: "Dim",
Params: []kind{numKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.decimal(0), c.decimal(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Sub(&d, x, y)
if err != nil {
return nil, err
}
if d.Negative {
return zero, nil
}
return &d, nil
}()
}
},
}, {
Name: "Erf",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Erf(x)
}()
}
},
}, {
Name: "Erfc",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Erfc(x)
}()
}
},
}, {
Name: "Erfinv",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Erfinv(x)
}()
}
},
}, {
Name: "Erfcinv",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Erfcinv(x)
}()
}
},
}, {
Name: "Exp",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Exp(&d, x)
return &d, err
}()
}
},
}, {
Name: "Exp2",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Pow(&d, two, x)
return &d, err
}()
}
},
}, {
Name: "Expm1",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Expm1(x)
}()
}
},
}, {
Name: "Gamma",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Gamma(x)
}()
}
},
}, {
Name: "Hypot",
Params: []kind{numKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
p, q := c.float64(0), c.float64(1)
if c.do() {
c.ret = func() interface{} {
return math.Hypot(p, q)
}()
}
},
}, {
Name: "J0",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.J0(x)
}()
}
},
}, {
Name: "Y0",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Y0(x)
}()
}
},
}, {
Name: "J1",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.J1(x)
}()
}
},
}, {
Name: "Y1",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Y1(x)
}()
}
},
}, {
Name: "Jn",
Params: []kind{intKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
n, x := c.int(0), c.float64(1)
if c.do() {
c.ret = func() interface{} {
return math.Jn(n, x)
}()
}
},
}, {
Name: "Yn",
Params: []kind{intKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
n, x := c.int(0), c.float64(1)
if c.do() {
c.ret = func() interface{} {
return math.Yn(n, x)
}()
}
},
}, {
Name: "Ldexp",
Params: []kind{numKind, intKind},
Result: numKind,
Func: func(c *callCtxt) {
frac, exp := c.float64(0), c.int(1)
if c.do() {
c.ret = func() interface{} {
return math.Ldexp(frac, exp)
}()
}
},
}, {
Name: "Log",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Ln(&d, x)
return &d, err
}()
}
},
}, {
Name: "Log10",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Log10(&d, x)
return &d, err
}()
}
},
}, {
Name: "Log2",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d, ln2 internal.Decimal
_, _ = apdContext.Ln(&ln2, two)
_, err := apdContext.Ln(&d, x)
if err != nil {
return &d, err
}
_, err = apdContext.Quo(&d, &d, &ln2)
return &d, nil
}()
}
},
}, {
Name: "Log1p",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Log1p(x)
}()
}
},
}, {
Name: "Logb",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Logb(x)
}()
}
},
}, {
Name: "Ilogb",
Params: []kind{numKind},
Result: intKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Ilogb(x)
}()
}
},
}, {
Name: "Mod",
Params: []kind{numKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.float64(0), c.float64(1)
if c.do() {
c.ret = func() interface{} {
return math.Mod(x, y)
}()
}
},
}, {
Name: "Pow",
Params: []kind{numKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.decimal(0), c.decimal(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var d internal.Decimal
_, err := apdContext.Pow(&d, x, y)
return &d, err
}()
}
},
}, {
Name: "Pow10",
Params: []kind{intKind},
Result: numKind,
Func: func(c *callCtxt) {
n := c.int32(0)
if c.do() {
c.ret = func() interface{} {
return apd.New(1, n)
}()
}
},
}, {
Name: "Remainder",
Params: []kind{numKind, numKind},
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.float64(0), c.float64(1)
if c.do() {
c.ret = func() interface{} {
return math.Remainder(x, y)
}()
}
},
}, {
Name: "Signbit",
Params: []kind{numKind},
Result: boolKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
if c.do() {
c.ret = func() interface{} {
return x.Negative
}()
}
},
}, {
Name: "Cos",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Cos(x)
}()
}
},
}, {
Name: "Sin",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Sin(x)
}()
}
},
}, {
Name: "Sinh",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Sinh(x)
}()
}
},
}, {
Name: "Cosh",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Cosh(x)
}()
}
},
}, {
Name: "Sqrt",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Sqrt(x)
}()
}
},
}, {
Name: "Tan",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Tan(x)
}()
}
},
}, {
Name: "Tanh",
Params: []kind{numKind},
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
if c.do() {
c.ret = func() interface{} {
return math.Tanh(x)
}()
}
},
}},
},
"math/bits": {
native: []*builtin{{
Name: "Lsh",
Params: []kind{intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
x, n := c.bigInt(0), c.uint(1)
if c.do() {
c.ret = func() interface{} {
var z big.Int
z.Lsh(x, n)
return &z
}()
}
},
}, {
Name: "Rsh",
Params: []kind{intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
x, n := c.bigInt(0), c.uint(1)
if c.do() {
c.ret = func() interface{} {
var z big.Int
z.Rsh(x, n)
return &z
}()
}
},
}, {
Name: "At",
Params: []kind{intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
x, i := c.bigInt(0), c.uint(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if i > math.MaxInt32 {
return 0, fmt.Errorf("bit index too large")
}
return x.Bit(int(i)), nil
}()
}
},
}, {
Name: "Set",
Params: []kind{intKind, intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
x, i, bit := c.bigInt(0), c.int(1), c.uint(2)
if c.do() {
c.ret = func() interface{} {
var z big.Int
z.SetBit(x, i, bit)
return &z
}()
}
},
}, {
Name: "And",
Params: []kind{intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.bigInt(0), c.bigInt(1)
if c.do() {
c.ret = func() interface{} {
var z big.Int
z.And(a, b)
return &z
}()
}
},
}, {
Name: "Or",
Params: []kind{intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.bigInt(0), c.bigInt(1)
if c.do() {
c.ret = func() interface{} {
var z big.Int
z.Or(a, b)
return &z
}()
}
},
}, {
Name: "Xor",
Params: []kind{intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.bigInt(0), c.bigInt(1)
if c.do() {
c.ret = func() interface{} {
var z big.Int
z.Xor(a, b)
return &z
}()
}
},
}, {
Name: "Clear",
Params: []kind{intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.bigInt(0), c.bigInt(1)
if c.do() {
c.ret = func() interface{} {
var z big.Int
z.AndNot(a, b)
return &z
}()
}
},
}, {
Name: "OnesCount",
Params: []kind{intKind},
Result: intKind,
Func: func(c *callCtxt) {
x := c.bigInt(0)
if c.do() {
c.ret = func() interface{} {
var count int
for _, w := range x.Bits() {
count += bits.OnesCount64(uint64(w))
}
return count
}()
}
},
}, {
Name: "Len",
Params: []kind{intKind},
Result: intKind,
Func: func(c *callCtxt) {
x := c.bigInt(0)
if c.do() {
c.ret = func() interface{} {
return x.BitLen()
}()
}
},
}},
},
"net": {
native: []*builtin{{
Name: "SplitHostPort",
Params: []kind{stringKind},
Result: listKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
host, port, err := net.SplitHostPort(s)
if err != nil {
return nil, err
}
return []string{host, port}, nil
}()
}
},
}, {
Name: "JoinHostPort",
Params: []kind{topKind, topKind},
Result: stringKind,
Func: func(c *callCtxt) {
host, port := c.value(0), c.value(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
var err error
hostStr := ""
switch host.Kind() {
case ListKind:
ipdata := netGetIP(host)
if len(ipdata) != 4 && len(ipdata) != 16 {
err = fmt.Errorf("invalid host %q", host)
}
hostStr = ipdata.String()
case BytesKind:
var b []byte
b, err = host.Bytes()
hostStr = string(b)
default:
hostStr, err = host.String()
}
if err != nil {
return "", err
}
portStr := ""
switch port.Kind() {
case StringKind:
portStr, err = port.String()
case BytesKind:
var b []byte
b, err = port.Bytes()
portStr = string(b)
default:
var i int64
i, err = port.Int64()
portStr = strconv.Itoa(int(i))
}
if err != nil {
return "", err
}
return net.JoinHostPort(hostStr, portStr), nil
}()
}
},
}, {
Name: "FQDN",
Params: []kind{stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
for i := 0; i < len(s); i++ {
if s[i] >= utf8.RuneSelf {
return false
}
}
_, err := idnaProfile.ToASCII(s)
return err == nil
}()
}
},
}, {
Name: "IPv4len",
Const: "4",
}, {
Name: "IPv6len",
Const: "16",
}, {
Name: "ParseIP",
Params: []kind{stringKind},
Result: listKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
goip := net.ParseIP(s)
if goip == nil {
return nil, fmt.Errorf("invalid IP address %q", s)
}
return netToList(goip), nil
}()
}
},
}, {
Name: "IPv4",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip).To4() != nil
}()
}
},
}, {
Name: "IP",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip) != nil
}()
}
},
}, {
Name: "LoopbackIP",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip).IsLoopback()
}()
}
},
}, {
Name: "MulticastIP",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip).IsMulticast()
}()
}
},
}, {
Name: "InterfaceLocalMulticastIP",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip).IsInterfaceLocalMulticast()
}()
}
},
}, {
Name: "LinkLocalMulticastIP",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip).IsLinkLocalMulticast()
}()
}
},
}, {
Name: "LinkLocalUnicastIP",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip).IsLinkLocalUnicast()
}()
}
},
}, {
Name: "GlobalUnicastIP",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip).IsGlobalUnicast()
}()
}
},
}, {
Name: "UnspecifiedIP",
Params: []kind{topKind},
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret = func() interface{} {
return netGetIP(ip).IsUnspecified()
}()
}
},
}, {
Name: "ToIP4",
Params: []kind{topKind},
Result: listKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
ipdata := netGetIP(ip)
if ipdata == nil {
return nil, fmt.Errorf("invalid IP %q", ip)
}
ipv4 := ipdata.To4()
if ipv4 == nil {
return nil, fmt.Errorf("cannot convert %q to IPv4", ipdata)
}
return netToList(ipv4), nil
}()
}
},
}, {
Name: "ToIP16",
Params: []kind{topKind},
Result: listKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
ipdata := netGetIP(ip)
if ipdata == nil {
return nil, fmt.Errorf("invalid IP %q", ip)
}
return netToList(ipdata), nil
}()
}
},
}, {
Name: "IPString",
Params: []kind{topKind},
Result: stringKind,
Func: func(c *callCtxt) {
ip := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
ipdata := netGetIP(ip)
if ipdata == nil {
return "", fmt.Errorf("invalid IP %q", ip)
}
return ipdata.String(), nil
}()
}
},
}},
},
"path": {
native: []*builtin{{
Name: "Split",
Params: []kind{stringKind},
Result: listKind,
Func: func(c *callCtxt) {
path := c.string(0)
if c.do() {
c.ret = func() interface{} {
file, dir := split(path)
return []string{file, dir}
}()
}
},
}, {
Name: "Match",
Params: []kind{stringKind, stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
pattern, name := c.string(0), c.string(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return path.Match(pattern, name)
}()
}
},
}, {
Name: "Clean",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
path := c.string(0)
if c.do() {
c.ret = func() interface{} {
return pathClean(path)
}()
}
},
}, {
Name: "Ext",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
path := c.string(0)
if c.do() {
c.ret = func() interface{} {
return pathExt(path)
}()
}
},
}, {
Name: "Base",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
path := c.string(0)
if c.do() {
c.ret = func() interface{} {
return pathBase(path)
}()
}
},
}, {
Name: "IsAbs",
Params: []kind{stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
path := c.string(0)
if c.do() {
c.ret = func() interface{} {
return pathIsAbs(path)
}()
}
},
}, {
Name: "Dir",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
path := c.string(0)
if c.do() {
c.ret = func() interface{} {
return pathDir(path)
}()
}
},
}},
},
"regexp": {
native: []*builtin{{
Name: "Valid",
Params: []kind{stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
pattern := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
_, err := regexp.Compile(pattern)
return err == nil, err
}()
}
},
}, {
Name: "Find",
Params: []kind{stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
pattern, s := c.string(0), c.string(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
re, err := regexp.Compile(pattern)
if err != nil {
return "", err
}
m := re.FindStringIndex(s)
if m == nil {
return "", errNoMatch
}
return s[m[0]:m[1]], nil
}()
}
},
}, {
Name: "FindAll",
Params: []kind{stringKind, stringKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
pattern, s, n := c.string(0), c.string(1), c.int(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
re, err := regexp.Compile(pattern)
if err != nil {
return nil, err
}
m := re.FindAllString(s, n)
if m == nil {
return nil, errNoMatch
}
return m, nil
}()
}
},
}, {
Name: "FindSubmatch",
Params: []kind{stringKind, stringKind},
Result: listKind,
Func: func(c *callCtxt) {
pattern, s := c.string(0), c.string(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
re, err := regexp.Compile(pattern)
if err != nil {
return nil, err
}
m := re.FindStringSubmatch(s)
if m == nil {
return nil, errNoMatch
}
return m, nil
}()
}
},
}, {
Name: "FindAllSubmatch",
Params: []kind{stringKind, stringKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
pattern, s, n := c.string(0), c.string(1), c.int(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
re, err := regexp.Compile(pattern)
if err != nil {
return nil, err
}
m := re.FindAllStringSubmatch(s, n)
if m == nil {
return nil, errNoMatch
}
return m, nil
}()
}
},
}, {
Name: "FindNamedSubmatch",
Params: []kind{stringKind, stringKind},
Result: structKind,
Func: func(c *callCtxt) {
pattern, s := c.string(0), c.string(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
re, err := regexp.Compile(pattern)
if err != nil {
return nil, err
}
names := re.SubexpNames()
if len(names) == 0 {
return nil, errNoNamedGroup
}
m := re.FindStringSubmatch(s)
if m == nil {
return nil, errNoMatch
}
r := make(map[string]string, len(names)-1)
for k, name := range names {
if name != "" {
r[name] = m[k]
}
}
return r, nil
}()
}
},
}, {
Name: "FindAllNamedSubmatch",
Params: []kind{stringKind, stringKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
pattern, s, n := c.string(0), c.string(1), c.int(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
re, err := regexp.Compile(pattern)
if err != nil {
return nil, err
}
names := re.SubexpNames()
if len(names) == 0 {
return nil, errNoNamedGroup
}
m := re.FindAllStringSubmatch(s, n)
if m == nil {
return nil, errNoMatch
}
result := make([]map[string]string, len(m))
for i, m := range m {
r := make(map[string]string, len(names)-1)
for k, name := range names {
if name != "" {
r[name] = m[k]
}
}
result[i] = r
}
return result, nil
}()
}
},
}, {
Name: "Match",
Params: []kind{stringKind, stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
pattern, s := c.string(0), c.string(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return regexp.MatchString(pattern, s)
}()
}
},
}, {
Name: "QuoteMeta",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return regexp.QuoteMeta(s)
}()
}
},
}},
},
"strconv": {
native: []*builtin{{
Name: "Unquote",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return literal.Unquote(s)
}()
}
},
}, {
Name: "ParseBool",
Params: []kind{stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
str := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return strconv.ParseBool(str)
}()
}
},
}, {
Name: "FormatBool",
Params: []kind{boolKind},
Result: stringKind,
Func: func(c *callCtxt) {
b := c.bool(0)
if c.do() {
c.ret = func() interface{} {
return strconv.FormatBool(b)
}()
}
},
}, {
Name: "ParseFloat",
Params: []kind{stringKind, intKind},
Result: numKind,
Func: func(c *callCtxt) {
s, bitSize := c.string(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return strconv.ParseFloat(s, bitSize)
}()
}
},
}, {
Name: "IntSize",
Const: "64",
}, {
Name: "ParseUint",
Params: []kind{stringKind, intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
s, base, bitSize := c.string(0), c.int(1), c.int(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return strconv.ParseUint(s, base, bitSize)
}()
}
},
}, {
Name: "ParseInt",
Params: []kind{stringKind, intKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
s, base, bitSize := c.string(0), c.int(1), c.int(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return strconv.ParseInt(s, base, bitSize)
}()
}
},
}, {
Name: "Atoi",
Params: []kind{stringKind},
Result: intKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return strconv.Atoi(s)
}()
}
},
}, {
Name: "FormatFloat",
Params: []kind{numKind, intKind, intKind, intKind},
Result: stringKind,
Func: func(c *callCtxt) {
f, fmt, prec, bitSize := c.float64(0), c.byte(1), c.int(2), c.int(3)
if c.do() {
c.ret = func() interface{} {
return strconv.FormatFloat(f, fmt, prec, bitSize)
}()
}
},
}, {
Name: "FormatUint",
Params: []kind{intKind, intKind},
Result: stringKind,
Func: func(c *callCtxt) {
i, base := c.uint64(0), c.int(1)
if c.do() {
c.ret = func() interface{} {
return strconv.FormatUint(i, base)
}()
}
},
}, {
Name: "FormatInt",
Params: []kind{intKind, intKind},
Result: stringKind,
Func: func(c *callCtxt) {
i, base := c.int64(0), c.int(1)
if c.do() {
c.ret = func() interface{} {
return strconv.FormatInt(i, base)
}()
}
},
}, {
Name: "Quote",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return strconv.Quote(s)
}()
}
},
}, {
Name: "QuoteToASCII",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return strconv.QuoteToASCII(s)
}()
}
},
}, {
Name: "QuoteToGraphic",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return strconv.QuoteToGraphic(s)
}()
}
},
}, {
Name: "QuoteRune",
Params: []kind{intKind},
Result: stringKind,
Func: func(c *callCtxt) {
r := c.rune(0)
if c.do() {
c.ret = func() interface{} {
return strconv.QuoteRune(r)
}()
}
},
}, {
Name: "QuoteRuneToASCII",
Params: []kind{intKind},
Result: stringKind,
Func: func(c *callCtxt) {
r := c.rune(0)
if c.do() {
c.ret = func() interface{} {
return strconv.QuoteRuneToASCII(r)
}()
}
},
}, {
Name: "QuoteRuneToGraphic",
Params: []kind{intKind},
Result: stringKind,
Func: func(c *callCtxt) {
r := c.rune(0)
if c.do() {
c.ret = func() interface{} {
return strconv.QuoteRuneToGraphic(r)
}()
}
},
}, {
Name: "IsPrint",
Params: []kind{intKind},
Result: boolKind,
Func: func(c *callCtxt) {
r := c.rune(0)
if c.do() {
c.ret = func() interface{} {
return strconv.IsPrint(r)
}()
}
},
}, {
Name: "IsGraphic",
Params: []kind{intKind},
Result: boolKind,
Func: func(c *callCtxt) {
r := c.rune(0)
if c.do() {
c.ret = func() interface{} {
return strconv.IsGraphic(r)
}()
}
},
}},
},
"strings": {
native: []*builtin{{
Name: "ByteAt",
Params: []kind{bytesKind | stringKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
b, i := c.bytes(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if i < 0 || i >= len(b) {
return 0, fmt.Errorf("index out of range")
}
return b[i], nil
}()
}
},
}, {
Name: "ByteSlice",
Params: []kind{bytesKind | stringKind, intKind, intKind},
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
b, start, end := c.bytes(0), c.int(1), c.int(2)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if start < 0 || start > end || end > len(b) {
return nil, fmt.Errorf("index out of range")
}
return b[start:end], nil
}()
}
},
}, {
Name: "Runes",
Params: []kind{stringKind},
Result: listKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return []rune(s)
}()
}
},
}, {
Name: "MinRunes",
Params: []kind{stringKind, intKind},
Result: boolKind,
Func: func(c *callCtxt) {
s, min := c.string(0), c.int(1)
if c.do() {
c.ret = func() interface{} {
return len([]rune(s)) >= min
}()
}
},
}, {
Name: "MaxRunes",
Params: []kind{stringKind, intKind},
Result: boolKind,
Func: func(c *callCtxt) {
s, max := c.string(0), c.int(1)
if c.do() {
c.ret = func() interface{} {
return len([]rune(s)) <= max
}()
}
},
}, {
Name: "ToTitle",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
prev := ' '
return strings.Map(
func(r rune) rune {
if unicode.IsSpace(prev) {
prev = r
return unicode.ToTitle(r)
}
prev = r
return r
},
s)
}()
}
},
}, {
Name: "ToCamel",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
prev := ' '
return strings.Map(
func(r rune) rune {
if unicode.IsSpace(prev) {
prev = r
return unicode.ToLower(r)
}
prev = r
return r
},
s)
}()
}
},
}, {
Name: "Compare",
Params: []kind{stringKind, stringKind},
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.Compare(a, b)
}()
}
},
}, {
Name: "Count",
Params: []kind{stringKind, stringKind},
Result: intKind,
Func: func(c *callCtxt) {
s, substr := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.Count(s, substr)
}()
}
},
}, {
Name: "Contains",
Params: []kind{stringKind, stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
s, substr := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.Contains(s, substr)
}()
}
},
}, {
Name: "ContainsAny",
Params: []kind{stringKind, stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
s, chars := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.ContainsAny(s, chars)
}()
}
},
}, {
Name: "LastIndex",
Params: []kind{stringKind, stringKind},
Result: intKind,
Func: func(c *callCtxt) {
s, substr := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.LastIndex(s, substr)
}()
}
},
}, {
Name: "IndexAny",
Params: []kind{stringKind, stringKind},
Result: intKind,
Func: func(c *callCtxt) {
s, chars := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.IndexAny(s, chars)
}()
}
},
}, {
Name: "LastIndexAny",
Params: []kind{stringKind, stringKind},
Result: intKind,
Func: func(c *callCtxt) {
s, chars := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.LastIndexAny(s, chars)
}()
}
},
}, {
Name: "SplitN",
Params: []kind{stringKind, stringKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
s, sep, n := c.string(0), c.string(1), c.int(2)
if c.do() {
c.ret = func() interface{} {
return strings.SplitN(s, sep, n)
}()
}
},
}, {
Name: "SplitAfterN",
Params: []kind{stringKind, stringKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
s, sep, n := c.string(0), c.string(1), c.int(2)
if c.do() {
c.ret = func() interface{} {
return strings.SplitAfterN(s, sep, n)
}()
}
},
}, {
Name: "Split",
Params: []kind{stringKind, stringKind},
Result: listKind,
Func: func(c *callCtxt) {
s, sep := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.Split(s, sep)
}()
}
},
}, {
Name: "SplitAfter",
Params: []kind{stringKind, stringKind},
Result: listKind,
Func: func(c *callCtxt) {
s, sep := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.SplitAfter(s, sep)
}()
}
},
}, {
Name: "Fields",
Params: []kind{stringKind},
Result: listKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return strings.Fields(s)
}()
}
},
}, {
Name: "Join",
Params: []kind{listKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
a, sep := c.strList(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.Join(a, sep)
}()
}
},
}, {
Name: "HasPrefix",
Params: []kind{stringKind, stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
s, prefix := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.HasPrefix(s, prefix)
}()
}
},
}, {
Name: "HasSuffix",
Params: []kind{stringKind, stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
s, suffix := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.HasSuffix(s, suffix)
}()
}
},
}, {
Name: "Repeat",
Params: []kind{stringKind, intKind},
Result: stringKind,
Func: func(c *callCtxt) {
s, count := c.string(0), c.int(1)
if c.do() {
c.ret = func() interface{} {
return strings.Repeat(s, count)
}()
}
},
}, {
Name: "ToUpper",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return strings.ToUpper(s)
}()
}
},
}, {
Name: "ToLower",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return strings.ToLower(s)
}()
}
},
}, {
Name: "Trim",
Params: []kind{stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s, cutset := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.Trim(s, cutset)
}()
}
},
}, {
Name: "TrimLeft",
Params: []kind{stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s, cutset := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.TrimLeft(s, cutset)
}()
}
},
}, {
Name: "TrimRight",
Params: []kind{stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s, cutset := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.TrimRight(s, cutset)
}()
}
},
}, {
Name: "TrimSpace",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return strings.TrimSpace(s)
}()
}
},
}, {
Name: "TrimPrefix",
Params: []kind{stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s, prefix := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.TrimPrefix(s, prefix)
}()
}
},
}, {
Name: "TrimSuffix",
Params: []kind{stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s, suffix := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.TrimSuffix(s, suffix)
}()
}
},
}, {
Name: "Replace",
Params: []kind{stringKind, stringKind, stringKind, intKind},
Result: stringKind,
Func: func(c *callCtxt) {
s, old, new, n := c.string(0), c.string(1), c.string(2), c.int(3)
if c.do() {
c.ret = func() interface{} {
return strings.Replace(s, old, new, n)
}()
}
},
}, {
Name: "Index",
Params: []kind{stringKind, stringKind},
Result: intKind,
Func: func(c *callCtxt) {
s, substr := c.string(0), c.string(1)
if c.do() {
c.ret = func() interface{} {
return strings.Index(s, substr)
}()
}
},
}},
},
"struct": {
native: []*builtin{{
Name: "MinFields",
Params: []kind{structKind, intKind},
Result: boolKind,
Func: func(c *callCtxt) {
object, n := c.structVal(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
iter := object.Fields(Hidden(false), Optional(false))
count := 0
for iter.Next() {
count++
}
return count >= n, nil
}()
}
},
}, {
Name: "MaxFields",
Params: []kind{structKind, intKind},
Result: boolKind,
Func: func(c *callCtxt) {
object, n := c.structVal(0), c.int(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
iter := object.Fields(Hidden(false), Optional(false))
count := 0
for iter.Next() {
count++
}
return count <= n, nil
}()
}
},
}},
},
"text/tabwriter": {
native: []*builtin{{
Name: "Write",
Params: []kind{topKind},
Result: stringKind,
Func: func(c *callCtxt) {
data := c.value(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
buf := &bytes.Buffer{}
tw := tabwriter.NewWriter(buf, 0, 4, 1, ' ', 0)
write := func(v Value) error {
b, err := v.Bytes()
if err != nil {
return err
}
_, err = tw.Write(b)
if err != nil {
return err
}
return nil
}
switch data.Kind() {
case BytesKind, StringKind:
if err := write(data); err != nil {
return "", err
}
case ListKind:
for i, _ := data.List(); i.Next(); {
if err := write(i.Value()); err != nil {
return "", err
}
_, _ = tw.Write([]byte{'\n'})
}
default:
return "", fmt.Errorf("tabwriter.Write: unsupported type %v", data.Kind())
}
err := tw.Flush()
return buf.String(), err
}()
}
},
}},
},
"text/template": {
native: []*builtin{{
Name: "Execute",
Params: []kind{stringKind, topKind},
Result: stringKind,
Func: func(c *callCtxt) {
templ, data := c.string(0), c.value(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
t, err := template.New("").Parse(templ)
if err != nil {
return "", err
}
var x interface{}
if err := data.Decode(&x); err != nil {
return "", err
}
buf := &bytes.Buffer{}
if err := t.Execute(buf, x); err != nil {
return "", err
}
return buf.String(), nil
}()
}
},
}, {
Name: "HTMLEscape",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return template.HTMLEscapeString(s)
}()
}
},
}, {
Name: "JSEscape",
Params: []kind{stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret = func() interface{} {
return template.JSEscapeString(s)
}()
}
},
}},
},
"time": {
native: []*builtin{{
Name: "Nanosecond",
Const: "1",
}, {
Name: "Microsecond",
Const: "1000",
}, {
Name: "Millisecond",
Const: "1000000",
}, {
Name: "Second",
Const: "1000000000",
}, {
Name: "Minute",
Const: "60000000000",
}, {
Name: "Hour",
Const: "3600000000000",
}, {
Name: "Duration",
Params: []kind{stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
if _, err := time.ParseDuration(s); err != nil {
return false, err
}
return true, nil
}()
}
},
}, {
Name: "ParseDuration",
Params: []kind{stringKind},
Result: intKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
d, err := time.ParseDuration(s)
if err != nil {
return 0, err
}
return int64(d), nil
}()
}
},
}, {
Name: "ANSIC",
Const: "\"Mon Jan _2 15:04:05 2006\"",
}, {
Name: "UnixDate",
Const: "\"Mon Jan _2 15:04:05 MST 2006\"",
}, {
Name: "RubyDate",
Const: "\"Mon Jan 02 15:04:05 -0700 2006\"",
}, {
Name: "RFC822",
Const: "\"02 Jan 06 15:04 MST\"",
}, {
Name: "RFC822Z",
Const: "\"02 Jan 06 15:04 -0700\"",
}, {
Name: "RFC850",
Const: "\"Monday, 02-Jan-06 15:04:05 MST\"",
}, {
Name: "RFC1123",
Const: "\"Mon, 02 Jan 2006 15:04:05 MST\"",
}, {
Name: "RFC1123Z",
Const: "\"Mon, 02 Jan 2006 15:04:05 -0700\"",
}, {
Name: "RFC3339",
Const: "\"2006-01-02T15:04:05Z07:00\"",
}, {
Name: "RFC3339Nano",
Const: "\"2006-01-02T15:04:05.999999999Z07:00\"",
}, {
Name: "RFC3339Date",
Const: "\"2006-01-02\"",
}, {
Name: "Kitchen",
Const: "\"3:04PM\"",
}, {
Name: "Kitchen24",
Const: "\"15:04\"",
}, {
Name: "January",
Const: "1",
}, {
Name: "February",
Const: "2",
}, {
Name: "March",
Const: "3",
}, {
Name: "April",
Const: "4",
}, {
Name: "May",
Const: "5",
}, {
Name: "June",
Const: "6",
}, {
Name: "July",
Const: "7",
}, {
Name: "August",
Const: "8",
}, {
Name: "September",
Const: "9",
}, {
Name: "October",
Const: "10",
}, {
Name: "November",
Const: "11",
}, {
Name: "December",
Const: "12",
}, {
Name: "Sunday",
Const: "0",
}, {
Name: "Monday",
Const: "1",
}, {
Name: "Tuesday",
Const: "2",
}, {
Name: "Wednesday",
Const: "3",
}, {
Name: "Thursday",
Const: "4",
}, {
Name: "Friday",
Const: "5",
}, {
Name: "Saturday",
Const: "6",
}, {
Name: "Time",
Params: []kind{stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
s := c.string(0)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return timeFormat(s, time.RFC3339Nano)
}()
}
},
}, {
Name: "Format",
Params: []kind{stringKind, stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
value, layout := c.string(0), c.string(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
return timeFormat(value, layout)
}()
}
},
}, {
Name: "Parse",
Params: []kind{stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
layout, value := c.string(0), c.string(1)
if c.do() {
c.ret, c.err = func() (interface{}, error) {
t, err := time.Parse(layout, value)
if err != nil {
return "", err
}
return t.UTC().Format(time.RFC3339Nano), nil
}()
}
},
}, {
Name: "Unix",
Params: []kind{intKind, intKind},
Result: stringKind,
Func: func(c *callCtxt) {
sec, nsec := c.int64(0), c.int64(1)
if c.do() {
c.ret = func() interface{} {
t := time.Unix(sec, nsec)
return t.UTC().Format(time.RFC3339Nano)
}()
}
},
}},
},
"tool": {
native: []*builtin{{}},
cue: `{
Command: {
$usage?: string
$short?: string
$long?: string
Tasks
}
Tasks: Task | {
[name=string]: Tasks
}
Task: {
$type: "tool.Task"
$id: =~"\\."
$after?: Task | [...Task]
}
Name :: =~"^\\PL([-](\\PL|\\PN))*$"
}`,
},
"tool/cli": {
native: []*builtin{{}},
cue: `{
Print: {
$id: *"tool/cli.Print" | "print"
text: string
}
}`,
},
"tool/exec": {
native: []*builtin{{}},
cue: `{
Run: {
$id: *"tool/exec.Run" | "exec"
cmd: string | [string, ...string]
env: {
[string]: string | [...=~"="]
}
stdout: *null | string | bytes
stderr: *null | string | bytes
stdin: *null | string | bytes
success: bool
}
}`,
},
"tool/file": {
native: []*builtin{{}},
cue: `{
Read: {
$id: "tool/file.Read"
filename: !=""
contents: *bytes | string
}
Create: {
$id: "tool/file.Create"
filename: !=""
contents: bytes | string
permissions: int | *420
}
Append: {
$id: "tool/file.Append"
filename: !=""
contents: bytes | string
permissions: int | *420
}
Glob: {
$id: "tool/file.Glob"
glob: !=""
files: [...string]
}
}`,
},
"tool/http": {
native: []*builtin{{}},
cue: `{
Get: Do & {
method: "GET"
}
Do: {
$id: *"tool/http.Do" | "http"
method: string
response: {
body: *bytes | string
header: {
[string]: string | [...string]
}
trailer: {
[string]: string | [...string]
}
status: string
statusCode: int
}
url: string
request: {
body: *bytes | string
header: {
[string]: string | [...string]
}
trailer: {
[string]: string | [...string]
}
}
}
Post: Do & {
method: "POST"
}
Put: Do & {
method: "PUT"
}
Delete: Do & {
method: "DELETE"
}
}`,
},
"tool/os": {
native: []*builtin{{}},
cue: `{
Name :: !="" & !~"^[$]"
Value :: bool | number | *string | null
Setenv: {
[Name]: Value
$id: "tool/os.Setenv"
}
Getenv: {
[Name]: Value
$id: "tool/os.Getenv"
}
Environ: {
[Name]: Value
$id: "tool/os.Environ"
}
Clearenv: {
$id: "tool/os.Clearenv"
}
}`,
},
}