summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/d5/tengo/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/d5/tengo/stdlib')
-rw-r--r--vendor/github.com/d5/tengo/stdlib/base64.go20
-rw-r--r--vendor/github.com/d5/tengo/stdlib/builtin_modules.go16
-rw-r--r--vendor/github.com/d5/tengo/stdlib/errors.go11
-rw-r--r--vendor/github.com/d5/tengo/stdlib/fmt.go110
-rw-r--r--vendor/github.com/d5/tengo/stdlib/func_typedefs.go1178
-rw-r--r--vendor/github.com/d5/tengo/stdlib/hex.go11
-rw-r--r--vendor/github.com/d5/tengo/stdlib/json.go126
-rw-r--r--vendor/github.com/d5/tengo/stdlib/json/decode.go374
-rw-r--r--vendor/github.com/d5/tengo/stdlib/json/encode.go147
-rw-r--r--vendor/github.com/d5/tengo/stdlib/json/scanner.go559
-rw-r--r--vendor/github.com/d5/tengo/stdlib/math.go74
-rw-r--r--vendor/github.com/d5/tengo/stdlib/os.go492
-rw-r--r--vendor/github.com/d5/tengo/stdlib/os_exec.go113
-rw-r--r--vendor/github.com/d5/tengo/stdlib/os_file.go96
-rw-r--r--vendor/github.com/d5/tengo/stdlib/os_process.go62
-rw-r--r--vendor/github.com/d5/tengo/stdlib/rand.go102
-rw-r--r--vendor/github.com/d5/tengo/stdlib/source_modules.go8
-rw-r--r--vendor/github.com/d5/tengo/stdlib/srcmod_enum.tengo128
-rw-r--r--vendor/github.com/d5/tengo/stdlib/stdlib.go34
-rw-r--r--vendor/github.com/d5/tengo/stdlib/text.go930
-rw-r--r--vendor/github.com/d5/tengo/stdlib/text_regexp.go228
-rw-r--r--vendor/github.com/d5/tengo/stdlib/times.go989
22 files changed, 0 insertions, 5808 deletions
diff --git a/vendor/github.com/d5/tengo/stdlib/base64.go b/vendor/github.com/d5/tengo/stdlib/base64.go
deleted file mode 100644
index 40a746ce..00000000
--- a/vendor/github.com/d5/tengo/stdlib/base64.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package stdlib
-
-import (
- "encoding/base64"
- "github.com/d5/tengo/objects"
-)
-
-var base64Module = map[string]objects.Object{
- "encode": &objects.UserFunction{Value: FuncAYRS(base64.StdEncoding.EncodeToString)},
- "decode": &objects.UserFunction{Value: FuncASRYE(base64.StdEncoding.DecodeString)},
-
- "raw_encode": &objects.UserFunction{Value: FuncAYRS(base64.RawStdEncoding.EncodeToString)},
- "raw_decode": &objects.UserFunction{Value: FuncASRYE(base64.RawStdEncoding.DecodeString)},
-
- "url_encode": &objects.UserFunction{Value: FuncAYRS(base64.URLEncoding.EncodeToString)},
- "url_decode": &objects.UserFunction{Value: FuncASRYE(base64.URLEncoding.DecodeString)},
-
- "raw_url_encode": &objects.UserFunction{Value: FuncAYRS(base64.RawURLEncoding.EncodeToString)},
- "raw_url_decode": &objects.UserFunction{Value: FuncASRYE(base64.RawURLEncoding.DecodeString)},
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/builtin_modules.go b/vendor/github.com/d5/tengo/stdlib/builtin_modules.go
deleted file mode 100644
index 722461b2..00000000
--- a/vendor/github.com/d5/tengo/stdlib/builtin_modules.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package stdlib
-
-import "github.com/d5/tengo/objects"
-
-// BuiltinModules are builtin type standard library modules.
-var BuiltinModules = map[string]map[string]objects.Object{
- "math": mathModule,
- "os": osModule,
- "text": textModule,
- "times": timesModule,
- "rand": randModule,
- "fmt": fmtModule,
- "json": jsonModule,
- "base64": base64Module,
- "hex": hexModule,
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/errors.go b/vendor/github.com/d5/tengo/stdlib/errors.go
deleted file mode 100644
index a2942bb0..00000000
--- a/vendor/github.com/d5/tengo/stdlib/errors.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package stdlib
-
-import "github.com/d5/tengo/objects"
-
-func wrapError(err error) objects.Object {
- if err == nil {
- return objects.TrueValue
- }
-
- return &objects.Error{Value: &objects.String{Value: err.Error()}}
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/fmt.go b/vendor/github.com/d5/tengo/stdlib/fmt.go
deleted file mode 100644
index b8f64278..00000000
--- a/vendor/github.com/d5/tengo/stdlib/fmt.go
+++ /dev/null
@@ -1,110 +0,0 @@
-package stdlib
-
-import (
- "fmt"
-
- "github.com/d5/tengo"
- "github.com/d5/tengo/objects"
-)
-
-var fmtModule = map[string]objects.Object{
- "print": &objects.UserFunction{Name: "print", Value: fmtPrint},
- "printf": &objects.UserFunction{Name: "printf", Value: fmtPrintf},
- "println": &objects.UserFunction{Name: "println", Value: fmtPrintln},
- "sprintf": &objects.UserFunction{Name: "sprintf", Value: fmtSprintf},
-}
-
-func fmtPrint(args ...objects.Object) (ret objects.Object, err error) {
- printArgs, err := getPrintArgs(args...)
- if err != nil {
- return nil, err
- }
-
- _, _ = fmt.Print(printArgs...)
-
- return nil, nil
-}
-
-func fmtPrintf(args ...objects.Object) (ret objects.Object, err error) {
- numArgs := len(args)
- if numArgs == 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- format, ok := args[0].(*objects.String)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "format",
- Expected: "string",
- Found: args[0].TypeName(),
- }
- }
- if numArgs == 1 {
- fmt.Print(format)
- return nil, nil
- }
-
- s, err := objects.Format(format.Value, args[1:]...)
- if err != nil {
- return nil, err
- }
-
- fmt.Print(s)
-
- return nil, nil
-}
-
-func fmtPrintln(args ...objects.Object) (ret objects.Object, err error) {
- printArgs, err := getPrintArgs(args...)
- if err != nil {
- return nil, err
- }
-
- printArgs = append(printArgs, "\n")
- _, _ = fmt.Print(printArgs...)
-
- return nil, nil
-}
-
-func fmtSprintf(args ...objects.Object) (ret objects.Object, err error) {
- numArgs := len(args)
- if numArgs == 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- format, ok := args[0].(*objects.String)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "format",
- Expected: "string",
- Found: args[0].TypeName(),
- }
- }
- if numArgs == 1 {
- return format, nil // okay to return 'format' directly as String is immutable
- }
-
- s, err := objects.Format(format.Value, args[1:]...)
- if err != nil {
- return nil, err
- }
-
- return &objects.String{Value: s}, nil
-}
-
-func getPrintArgs(args ...objects.Object) ([]interface{}, error) {
- var printArgs []interface{}
- l := 0
- for _, arg := range args {
- s, _ := objects.ToString(arg)
- slen := len(s)
- if l+slen > tengo.MaxStringLen { // make sure length does not exceed the limit
- return nil, objects.ErrStringLimit
- }
- l += slen
-
- printArgs = append(printArgs, s)
- }
-
- return printArgs, nil
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/func_typedefs.go b/vendor/github.com/d5/tengo/stdlib/func_typedefs.go
deleted file mode 100644
index c7bd11fa..00000000
--- a/vendor/github.com/d5/tengo/stdlib/func_typedefs.go
+++ /dev/null
@@ -1,1178 +0,0 @@
-package stdlib
-
-import (
- "fmt"
-
- "github.com/d5/tengo"
- "github.com/d5/tengo/objects"
-)
-
-// FuncAR transform a function of 'func()' signature
-// into CallableFunc type.
-func FuncAR(fn func()) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- fn()
-
- return objects.UndefinedValue, nil
- }
-}
-
-// FuncARI transform a function of 'func() int' signature
-// into CallableFunc type.
-func FuncARI(fn func() int) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- return &objects.Int{Value: int64(fn())}, nil
- }
-}
-
-// FuncARI64 transform a function of 'func() int64' signature
-// into CallableFunc type.
-func FuncARI64(fn func() int64) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- return &objects.Int{Value: fn()}, nil
- }
-}
-
-// FuncAI64RI64 transform a function of 'func(int64) int64' signature
-// into CallableFunc type.
-func FuncAI64RI64(fn func(int64) int64) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- return &objects.Int{Value: fn(i1)}, nil
- }
-}
-
-// FuncAI64R transform a function of 'func(int64)' signature
-// into CallableFunc type.
-func FuncAI64R(fn func(int64)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- fn(i1)
-
- return objects.UndefinedValue, nil
- }
-}
-
-// FuncARB transform a function of 'func() bool' signature
-// into CallableFunc type.
-func FuncARB(fn func() bool) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- if fn() {
- return objects.TrueValue, nil
- }
-
- return objects.FalseValue, nil
- }
-}
-
-// FuncARE transform a function of 'func() error' signature
-// into CallableFunc type.
-func FuncARE(fn func() error) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- return wrapError(fn()), nil
- }
-}
-
-// FuncARS transform a function of 'func() string' signature
-// into CallableFunc type.
-func FuncARS(fn func() string) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s := fn()
-
- if len(s) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: s}, nil
- }
-}
-
-// FuncARSE transform a function of 'func() (string, error)' signature
-// into CallableFunc type.
-func FuncARSE(fn func() (string, error)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- res, err := fn()
- if err != nil {
- return wrapError(err), nil
- }
-
- if len(res) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: res}, nil
- }
-}
-
-// FuncARYE transform a function of 'func() ([]byte, error)' signature
-// into CallableFunc type.
-func FuncARYE(fn func() ([]byte, error)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- res, err := fn()
- if err != nil {
- return wrapError(err), nil
- }
-
- if len(res) > tengo.MaxBytesLen {
- return nil, objects.ErrBytesLimit
- }
-
- return &objects.Bytes{Value: res}, nil
- }
-}
-
-// FuncARF transform a function of 'func() float64' signature
-// into CallableFunc type.
-func FuncARF(fn func() float64) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- return &objects.Float{Value: fn()}, nil
- }
-}
-
-// FuncARSs transform a function of 'func() []string' signature
-// into CallableFunc type.
-func FuncARSs(fn func() []string) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- arr := &objects.Array{}
- for _, elem := range fn() {
- if len(elem) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- arr.Value = append(arr.Value, &objects.String{Value: elem})
- }
-
- return arr, nil
- }
-}
-
-// FuncARIsE transform a function of 'func() ([]int, error)' signature
-// into CallableFunc type.
-func FuncARIsE(fn func() ([]int, error)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- res, err := fn()
- if err != nil {
- return wrapError(err), nil
- }
-
- arr := &objects.Array{}
- for _, v := range res {
- arr.Value = append(arr.Value, &objects.Int{Value: int64(v)})
- }
-
- return arr, nil
- }
-}
-
-// FuncAIRIs transform a function of 'func(int) []int' signature
-// into CallableFunc type.
-func FuncAIRIs(fn func(int) []int) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res := fn(i1)
-
- arr := &objects.Array{}
- for _, v := range res {
- arr.Value = append(arr.Value, &objects.Int{Value: int64(v)})
- }
-
- return arr, nil
- }
-}
-
-// FuncAFRF transform a function of 'func(float64) float64' signature
-// into CallableFunc type.
-func FuncAFRF(fn func(float64) float64) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- f1, ok := objects.ToFloat64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "float(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- return &objects.Float{Value: fn(f1)}, nil
- }
-}
-
-// FuncAIR transform a function of 'func(int)' signature
-// into CallableFunc type.
-func FuncAIR(fn func(int)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- fn(i1)
-
- return objects.UndefinedValue, nil
- }
-}
-
-// FuncAIRF transform a function of 'func(int) float64' signature
-// into CallableFunc type.
-func FuncAIRF(fn func(int) float64) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- return &objects.Float{Value: fn(i1)}, nil
- }
-}
-
-// FuncAFRI transform a function of 'func(float64) int' signature
-// into CallableFunc type.
-func FuncAFRI(fn func(float64) int) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- f1, ok := objects.ToFloat64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "float(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- return &objects.Int{Value: int64(fn(f1))}, nil
- }
-}
-
-// FuncAFFRF transform a function of 'func(float64, float64) float64' signature
-// into CallableFunc type.
-func FuncAFFRF(fn func(float64, float64) float64) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- f1, ok := objects.ToFloat64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "float(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- f2, ok := objects.ToFloat64(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "float(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- return &objects.Float{Value: fn(f1, f2)}, nil
- }
-}
-
-// FuncAIFRF transform a function of 'func(int, float64) float64' signature
-// into CallableFunc type.
-func FuncAIFRF(fn func(int, float64) float64) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- f2, ok := objects.ToFloat64(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "float(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- return &objects.Float{Value: fn(i1, f2)}, nil
- }
-}
-
-// FuncAFIRF transform a function of 'func(float64, int) float64' signature
-// into CallableFunc type.
-func FuncAFIRF(fn func(float64, int) float64) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- f1, ok := objects.ToFloat64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "float(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- return &objects.Float{Value: fn(f1, i2)}, nil
- }
-}
-
-// FuncAFIRB transform a function of 'func(float64, int) bool' signature
-// into CallableFunc type.
-func FuncAFIRB(fn func(float64, int) bool) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- f1, ok := objects.ToFloat64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "float(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- if fn(f1, i2) {
- return objects.TrueValue, nil
- }
-
- return objects.FalseValue, nil
- }
-}
-
-// FuncAFRB transform a function of 'func(float64) bool' signature
-// into CallableFunc type.
-func FuncAFRB(fn func(float64) bool) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- f1, ok := objects.ToFloat64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "float(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- if fn(f1) {
- return objects.TrueValue, nil
- }
-
- return objects.FalseValue, nil
- }
-}
-
-// FuncASRS transform a function of 'func(string) string' signature into CallableFunc type.
-// User function will return 'true' if underlying native function returns nil.
-func FuncASRS(fn func(string) string) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- s := fn(s1)
-
- if len(s) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: s}, nil
- }
-}
-
-// FuncASRSs transform a function of 'func(string) []string' signature into CallableFunc type.
-func FuncASRSs(fn func(string) []string) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res := fn(s1)
-
- arr := &objects.Array{}
- for _, elem := range res {
- if len(elem) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- arr.Value = append(arr.Value, &objects.String{Value: elem})
- }
-
- return arr, nil
- }
-}
-
-// FuncASRSE transform a function of 'func(string) (string, error)' signature into CallableFunc type.
-// User function will return 'true' if underlying native function returns nil.
-func FuncASRSE(fn func(string) (string, error)) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := fn(s1)
- if err != nil {
- return wrapError(err), nil
- }
-
- if len(res) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: res}, nil
- }
-}
-
-// FuncASRE transform a function of 'func(string) error' signature into CallableFunc type.
-// User function will return 'true' if underlying native function returns nil.
-func FuncASRE(fn func(string) error) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- return wrapError(fn(s1)), nil
- }
-}
-
-// FuncASSRE transform a function of 'func(string, string) error' signature into CallableFunc type.
-// User function will return 'true' if underlying native function returns nil.
-func FuncASSRE(fn func(string, string) error) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- return wrapError(fn(s1, s2)), nil
- }
-}
-
-// FuncASSRSs transform a function of 'func(string, string) []string' signature into CallableFunc type.
-func FuncASSRSs(fn func(string, string) []string) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- arr := &objects.Array{}
- for _, res := range fn(s1, s2) {
- if len(res) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- arr.Value = append(arr.Value, &objects.String{Value: res})
- }
-
- return arr, nil
- }
-}
-
-// FuncASSIRSs transform a function of 'func(string, string, int) []string' signature into CallableFunc type.
-func FuncASSIRSs(fn func(string, string, int) []string) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 3 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- i3, ok := objects.ToInt(args[2])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- }
-
- arr := &objects.Array{}
- for _, res := range fn(s1, s2, i3) {
- if len(res) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- arr.Value = append(arr.Value, &objects.String{Value: res})
- }
-
- return arr, nil
- }
-}
-
-// FuncASSRI transform a function of 'func(string, string) int' signature into CallableFunc type.
-func FuncASSRI(fn func(string, string) int) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- return &objects.Int{Value: int64(fn(s1, s2))}, nil
- }
-}
-
-// FuncASSRS transform a function of 'func(string, string) string' signature into CallableFunc type.
-func FuncASSRS(fn func(string, string) string) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- s := fn(s1, s2)
-
- if len(s) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: s}, nil
- }
-}
-
-// FuncASSRB transform a function of 'func(string, string) bool' signature into CallableFunc type.
-func FuncASSRB(fn func(string, string) bool) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- if fn(s1, s2) {
- return objects.TrueValue, nil
- }
-
- return objects.FalseValue, nil
- }
-}
-
-// FuncASsSRS transform a function of 'func([]string, string) string' signature into CallableFunc type.
-func FuncASsSRS(fn func([]string, string) string) objects.CallableFunc {
- return func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- var ss1 []string
- switch arg0 := args[0].(type) {
- case *objects.Array:
- for idx, a := range arg0.Value {
- as, ok := objects.ToString(a)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: fmt.Sprintf("first[%d]", idx),
- Expected: "string(compatible)",
- Found: a.TypeName(),
- }
- }
- ss1 = append(ss1, as)
- }
- case *objects.ImmutableArray:
- for idx, a := range arg0.Value {
- as, ok := objects.ToString(a)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: fmt.Sprintf("first[%d]", idx),
- Expected: "string(compatible)",
- Found: a.TypeName(),
- }
- }
- ss1 = append(ss1, as)
- }
- default:
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "array",
- Found: args[0].TypeName(),
- }
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- s := fn(ss1, s2)
- if len(s) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: s}, nil
- }
-}
-
-// FuncASI64RE transform a function of 'func(string, int64) error' signature
-// into CallableFunc type.
-func FuncASI64RE(fn func(string, int64) error) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- i2, ok := objects.ToInt64(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- return wrapError(fn(s1, i2)), nil
- }
-}
-
-// FuncAIIRE transform a function of 'func(int, int) error' signature
-// into CallableFunc type.
-func FuncAIIRE(fn func(int, int) error) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- return wrapError(fn(i1, i2)), nil
- }
-}
-
-// FuncASIRS transform a function of 'func(string, int) string' signature
-// into CallableFunc type.
-func FuncASIRS(fn func(string, int) string) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- s := fn(s1, i2)
-
- if len(s) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: s}, nil
- }
-}
-
-// FuncASIIRE transform a function of 'func(string, int, int) error' signature
-// into CallableFunc type.
-func FuncASIIRE(fn func(string, int, int) error) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 3 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- i3, ok := objects.ToInt(args[2])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- }
-
- return wrapError(fn(s1, i2, i3)), nil
- }
-}
-
-// FuncAYRIE transform a function of 'func([]byte) (int, error)' signature
-// into CallableFunc type.
-func FuncAYRIE(fn func([]byte) (int, error)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- y1, ok := objects.ToByteSlice(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "bytes(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := fn(y1)
- if err != nil {
- return wrapError(err), nil
- }
-
- return &objects.Int{Value: int64(res)}, nil
- }
-}
-
-// FuncAYRS transform a function of 'func([]byte) string' signature
-// into CallableFunc type.
-func FuncAYRS(fn func([]byte) string) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- y1, ok := objects.ToByteSlice(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "bytes(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res := fn(y1)
-
- return &objects.String{Value: res}, nil
- }
-}
-
-// FuncASRIE transform a function of 'func(string) (int, error)' signature
-// into CallableFunc type.
-func FuncASRIE(fn func(string) (int, error)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := fn(s1)
- if err != nil {
- return wrapError(err), nil
- }
-
- return &objects.Int{Value: int64(res)}, nil
- }
-}
-
-// FuncASRYE transform a function of 'func(string) ([]byte, error)' signature
-// into CallableFunc type.
-func FuncASRYE(fn func(string) ([]byte, error)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := fn(s1)
- if err != nil {
- return wrapError(err), nil
- }
-
- if len(res) > tengo.MaxBytesLen {
- return nil, objects.ErrBytesLimit
- }
-
- return &objects.Bytes{Value: res}, nil
- }
-}
-
-// FuncAIRSsE transform a function of 'func(int) ([]string, error)' signature
-// into CallableFunc type.
-func FuncAIRSsE(fn func(int) ([]string, error)) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := fn(i1)
- if err != nil {
- return wrapError(err), nil
- }
-
- arr := &objects.Array{}
- for _, r := range res {
- if len(r) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- arr.Value = append(arr.Value, &objects.String{Value: r})
- }
-
- return arr, nil
- }
-}
-
-// FuncAIRS transform a function of 'func(int) string' signature
-// into CallableFunc type.
-func FuncAIRS(fn func(int) string) objects.CallableFunc {
- return func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- s := fn(i1)
-
- if len(s) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: s}, nil
- }
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/hex.go b/vendor/github.com/d5/tengo/stdlib/hex.go
deleted file mode 100644
index acc29e6a..00000000
--- a/vendor/github.com/d5/tengo/stdlib/hex.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package stdlib
-
-import (
- "encoding/hex"
- "github.com/d5/tengo/objects"
-)
-
-var hexModule = map[string]objects.Object{
- "encode": &objects.UserFunction{Value: FuncAYRS(hex.EncodeToString)},
- "decode": &objects.UserFunction{Value: FuncASRYE(hex.DecodeString)},
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/json.go b/vendor/github.com/d5/tengo/stdlib/json.go
deleted file mode 100644
index f913dc48..00000000
--- a/vendor/github.com/d5/tengo/stdlib/json.go
+++ /dev/null
@@ -1,126 +0,0 @@
-package stdlib
-
-import (
- "bytes"
- gojson "encoding/json"
-
- "github.com/d5/tengo/objects"
- "github.com/d5/tengo/stdlib/json"
-)
-
-var jsonModule = map[string]objects.Object{
- "decode": &objects.UserFunction{Name: "decode", Value: jsonDecode},
- "encode": &objects.UserFunction{Name: "encode", Value: jsonEncode},
- "indent": &objects.UserFunction{Name: "encode", Value: jsonIndent},
- "html_escape": &objects.UserFunction{Name: "html_escape", Value: jsonHTMLEscape},
-}
-
-func jsonDecode(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- switch o := args[0].(type) {
- case *objects.Bytes:
- v, err := json.Decode(o.Value)
- if err != nil {
- return &objects.Error{Value: &objects.String{Value: err.Error()}}, nil
- }
- return v, nil
- case *objects.String:
- v, err := json.Decode([]byte(o.Value))
- if err != nil {
- return &objects.Error{Value: &objects.String{Value: err.Error()}}, nil
- }
- return v, nil
- default:
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "bytes/string",
- Found: args[0].TypeName(),
- }
- }
-}
-
-func jsonEncode(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- b, err := json.Encode(args[0])
- if err != nil {
- return &objects.Error{Value: &objects.String{Value: err.Error()}}, nil
- }
-
- return &objects.Bytes{Value: b}, nil
-}
-
-func jsonIndent(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 3 {
- return nil, objects.ErrWrongNumArguments
- }
-
- prefix, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "prefix",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- indent, ok := objects.ToString(args[2])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "indent",
- Expected: "string(compatible)",
- Found: args[2].TypeName(),
- }
- }
-
- switch o := args[0].(type) {
- case *objects.Bytes:
- var dst bytes.Buffer
- err := gojson.Indent(&dst, o.Value, prefix, indent)
- if err != nil {
- return &objects.Error{Value: &objects.String{Value: err.Error()}}, nil
- }
- return &objects.Bytes{Value: dst.Bytes()}, nil
- case *objects.String:
- var dst bytes.Buffer
- err := gojson.Indent(&dst, []byte(o.Value), prefix, indent)
- if err != nil {
- return &objects.Error{Value: &objects.String{Value: err.Error()}}, nil
- }
- return &objects.Bytes{Value: dst.Bytes()}, nil
- default:
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "bytes/string",
- Found: args[0].TypeName(),
- }
- }
-}
-
-func jsonHTMLEscape(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- switch o := args[0].(type) {
- case *objects.Bytes:
- var dst bytes.Buffer
- gojson.HTMLEscape(&dst, o.Value)
- return &objects.Bytes{Value: dst.Bytes()}, nil
- case *objects.String:
- var dst bytes.Buffer
- gojson.HTMLEscape(&dst, []byte(o.Value))
- return &objects.Bytes{Value: dst.Bytes()}, nil
- default:
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "bytes/string",
- Found: args[0].TypeName(),
- }
- }
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/json/decode.go b/vendor/github.com/d5/tengo/stdlib/json/decode.go
deleted file mode 100644
index 5a3fe6c7..00000000
--- a/vendor/github.com/d5/tengo/stdlib/json/decode.go
+++ /dev/null
@@ -1,374 +0,0 @@
-// A modified version of Go's JSON implementation.
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
- "strconv"
- "unicode"
- "unicode/utf16"
- "unicode/utf8"
-
- "github.com/d5/tengo/objects"
-)
-
-// Decode parses the JSON-encoded data and returns the result object.
-func Decode(data []byte) (objects.Object, error) {
- var d decodeState
- err := checkValid(data, &d.scan)
- if err != nil {
- return nil, err
- }
-
- d.init(data)
- d.scan.reset()
- d.scanWhile(scanSkipSpace)
-
- return d.value()
-}
-
-// decodeState represents the state while decoding a JSON value.
-type decodeState struct {
- data []byte
- off int // next read offset in data
- opcode int // last read result
- scan scanner
-}
-
-// readIndex returns the position of the last byte read.
-func (d *decodeState) readIndex() int {
- return d.off - 1
-}
-
-const phasePanicMsg = "JSON decoder out of sync - data changing underfoot?"
-
-func (d *decodeState) init(data []byte) *decodeState {
- d.data = data
- d.off = 0
- return d
-}
-
-// scanNext processes the byte at d.data[d.off].
-func (d *decodeState) scanNext() {
- if d.off < len(d.data) {
- d.opcode = d.scan.step(&d.scan, d.data[d.off])
- d.off++
- } else {
- d.opcode = d.scan.eof()
- d.off = len(d.data) + 1 // mark processed EOF with len+1
- }
-}
-
-// scanWhile processes bytes in d.data[d.off:] until it
-// receives a scan code not equal to op.
-func (d *decodeState) scanWhile(op int) {
- s, data, i := &d.scan, d.data, d.off
- for i < len(data) {
- newOp := s.step(s, data[i])
- i++
- if newOp != op {
- d.opcode = newOp
- d.off = i
- return
- }
- }
-
- d.off = len(data) + 1 // mark processed EOF with len+1
- d.opcode = d.scan.eof()
-}
-
-func (d *decodeState) value() (objects.Object, error) {
- switch d.opcode {
- default:
- panic(phasePanicMsg)
-
- case scanBeginArray:
- o, err := d.array()
- if err != nil {
- return nil, err
- }
-
- d.scanNext()
-
- return o, nil
-
- case scanBeginObject:
- o, err := d.object()
- if err != nil {
- return nil, err
- }
-
- d.scanNext()
-
- return o, nil
-
- case scanBeginLiteral:
- return d.literal()
- }
-}
-
-func (d *decodeState) array() (objects.Object, error) {
- var arr []objects.Object
- for {
- // Look ahead for ] - can only happen on first iteration.
- d.scanWhile(scanSkipSpace)
- if d.opcode == scanEndArray {
- break
- }
-
- o, err := d.value()
- if err != nil {
- return nil, err
- }
- arr = append(arr, o)
-
- // Next token must be , or ].
- if d.opcode == scanSkipSpace {
- d.scanWhile(scanSkipSpace)
- }
- if d.opcode == scanEndArray {
- break
- }
- if d.opcode != scanArrayValue {
- panic(phasePanicMsg)
- }
- }
-
- return &objects.Array{Value: arr}, nil
-}
-
-func (d *decodeState) object() (objects.Object, error) {
- m := make(map[string]objects.Object)
- for {
- // Read opening " of string key or closing }.
- d.scanWhile(scanSkipSpace)
- if d.opcode == scanEndObject {
- // closing } - can only happen on first iteration.
- break
- }
- if d.opcode != scanBeginLiteral {
- panic(phasePanicMsg)
- }
-
- // Read string key.
- start := d.readIndex()
- d.scanWhile(scanContinue)
- item := d.data[start:d.readIndex()]
- key, ok := unquote(item)
- if !ok {
- panic(phasePanicMsg)
- }
-
- // Read : before value.
- if d.opcode == scanSkipSpace {
- d.scanWhile(scanSkipSpace)
- }
- if d.opcode != scanObjectKey {
- panic(phasePanicMsg)
- }
- d.scanWhile(scanSkipSpace)
-
- // Read value.
- o, err := d.value()
- if err != nil {
- return nil, err
- }
-
- m[key] = o
-
- // Next token must be , or }.
- if d.opcode == scanSkipSpace {
- d.scanWhile(scanSkipSpace)
- }
- if d.opcode == scanEndObject {
- break
- }
- if d.opcode != scanObjectValue {
- panic(phasePanicMsg)
- }
- }
-
- return &objects.Map{Value: m}, nil
-}
-
-func (d *decodeState) literal() (objects.Object, error) {
- // All bytes inside literal return scanContinue op code.
- start := d.readIndex()
- d.scanWhile(scanContinue)
-
- item := d.data[start:d.readIndex()]
-
- switch c := item[0]; c {
- case 'n': // null
- return objects.UndefinedValue, nil
-
- case 't', 'f': // true, false
- if c == 't' {
- return objects.TrueValue, nil
- }
- return objects.FalseValue, nil
-
- case '"': // string
- s, ok := unquote(item)
- if !ok {
- panic(phasePanicMsg)
- }
- return &objects.String{Value: s}, nil
-
- default: // number
- if c != '-' && (c < '0' || c > '9') {
- panic(phasePanicMsg)
- }
-
- n, _ := strconv.ParseFloat(string(item), 10)
- return &objects.Float{Value: n}, nil
- }
-}
-
-// getu4 decodes \uXXXX from the beginning of s, returning the hex value,
-// or it returns -1.
-func getu4(s []byte) rune {
- if len(s) < 6 || s[0] != '\\' || s[1] != 'u' {
- return -1
- }
- var r rune
- for _, c := range s[2:6] {
- switch {
- case '0' <= c && c <= '9':
- c = c - '0'
- case 'a' <= c && c <= 'f':
- c = c - 'a' + 10
- case 'A' <= c && c <= 'F':
- c = c - 'A' + 10
- default:
- return -1
- }
- r = r*16 + rune(c)
- }
- return r
-}
-
-// unquote converts a quoted JSON string literal s into an actual string t.
-// The rules are different than for Go, so cannot use strconv.Unquote.
-func unquote(s []byte) (t string, ok bool) {
- s, ok = unquoteBytes(s)
- t = string(s)
- return
-}
-
-func unquoteBytes(s []byte) (t []byte, ok bool) {
- if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
- return
- }
- s = s[1 : len(s)-1]
-
- // Check for unusual characters. If there are none,
- // then no unquoting is needed, so return a slice of the
- // original bytes.
- r := 0
- for r < len(s) {
- c := s[r]
- if c == '\\' || c == '"' || c < ' ' {
- break
- }
- if c < utf8.RuneSelf {
- r++
- continue
- }
- rr, size := utf8.DecodeRune(s[r:])
- if rr == utf8.RuneError && size == 1 {
- break
- }
- r += size
- }
- if r == len(s) {
- return s, true
- }
-
- b := make([]byte, len(s)+2*utf8.UTFMax)
- w := copy(b, s[0:r])
- for r < len(s) {
- // Out of room? Can only happen if s is full of
- // malformed UTF-8 and we're replacing each
- // byte with RuneError.
- if w >= len(b)-2*utf8.UTFMax {
- nb := make([]byte, (len(b)+utf8.UTFMax)*2)
- copy(nb, b[0:w])
- b = nb
- }
- switch c := s[r]; {
- case c == '\\':
- r++
- if r >= len(s) {
- return
- }
- switch s[r] {
- default:
- return
- case '"', '\\', '/', '\'':
- b[w] = s[r]
- r++
- w++
- case 'b':
- b[w] = '\b'
- r++
- w++
- case 'f':
- b[w] = '\f'
- r++
- w++
- case 'n':
- b[w] = '\n'
- r++
- w++
- case 'r':
- b[w] = '\r'
- r++
- w++
- case 't':
- b[w] = '\t'
- r++
- w++
- case 'u':
- r--
- rr := getu4(s[r:])
- if rr < 0 {
- return
- }
- r += 6
- if utf16.IsSurrogate(rr) {
- rr1 := getu4(s[r:])
- if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar {
- // A valid pair; consume.
- r += 6
- w += utf8.EncodeRune(b[w:], dec)
- break
- }
- // Invalid surrogate; fall back to replacement rune.
- rr = unicode.ReplacementChar
- }
- w += utf8.EncodeRune(b[w:], rr)
- }
-
- // Quote, control characters are invalid.
- case c == '"', c < ' ':
- return
-
- // ASCII
- case c < utf8.RuneSelf:
- b[w] = c
- r++
- w++
-
- // Coerce to well-formed UTF-8.
- default:
- rr, size := utf8.DecodeRune(s[r:])
- r += size
- w += utf8.EncodeRune(b[w:], rr)
- }
- }
- return b[0:w], true
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/json/encode.go b/vendor/github.com/d5/tengo/stdlib/json/encode.go
deleted file mode 100644
index 2b8b17eb..00000000
--- a/vendor/github.com/d5/tengo/stdlib/json/encode.go
+++ /dev/null
@@ -1,147 +0,0 @@
-// A modified version of Go's JSON implementation.
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
- "encoding/base64"
- "errors"
- "math"
- "strconv"
-
- "github.com/d5/tengo/objects"
-)
-
-// Encode returns the JSON encoding of the object.
-func Encode(o objects.Object) ([]byte, error) {
- var b []byte
-
- switch o := o.(type) {
- case *objects.Array:
- b = append(b, '[')
- len1 := len(o.Value) - 1
- for idx, elem := range o.Value {
- eb, err := Encode(elem)
- if err != nil {
- return nil, err
- }
- b = append(b, eb...)
- if idx < len1 {
- b = append(b, ',')
- }
- }
- b = append(b, ']')
- case *objects.ImmutableArray:
- b = append(b, '[')
- len1 := len(o.Value) - 1
- for idx, elem := range o.Value {
- eb, err := Encode(elem)
- if err != nil {
- return nil, err
- }
- b = append(b, eb...)
- if idx < len1 {
- b = append(b, ',')
- }
- }
- b = append(b, ']')
- case *objects.Map:
- b = append(b, '{')
- len1 := len(o.Value) - 1
- idx := 0
- for key, value := range o.Value {
- b = strconv.AppendQuote(b, key)
- b = append(b, ':')
- eb, err := Encode(value)
- if err != nil {
- return nil, err
- }
- b = append(b, eb...)
- if idx < len1 {
- b = append(b, ',')
- }
- idx++
- }
- b = append(b, '}')
- case *objects.ImmutableMap:
- b = append(b, '{')
- len1 := len(o.Value) - 1
- idx := 0
- for key, value := range o.Value {
- b = strconv.AppendQuote(b, key)
- b = append(b, ':')
- eb, err := Encode(value)
- if err != nil {
- return nil, err
- }
- b = append(b, eb...)
- if idx < len1 {
- b = append(b, ',')
- }
- idx++
- }
- b = append(b, '}')
- case *objects.Bool:
- if o.IsFalsy() {
- b = strconv.AppendBool(b, false)
- } else {
- b = strconv.AppendBool(b, true)
- }
- case *objects.Bytes:
- b = append(b, '"')
- encodedLen := base64.StdEncoding.EncodedLen(len(o.Value))
- dst := make([]byte, encodedLen)
- base64.StdEncoding.Encode(dst, o.Value)
- b = append(b, dst...)
- b = append(b, '"')
- case *objects.Char:
- b = strconv.AppendInt(b, int64(o.Value), 10)
- case *objects.Float:
- var y []byte
-
- f := o.Value
- if math.IsInf(f, 0) || math.IsNaN(f) {
- return nil, errors.New("unsupported float value")
- }
-
- // Convert as if by ES6 number to string conversion.
- // This matches most other JSON generators.
- abs := math.Abs(f)
- fmt := byte('f')
- if abs != 0 {
- if abs < 1e-6 || abs >= 1e21 {
- fmt = 'e'
- }
- }
- y = strconv.AppendFloat(y, f, fmt, -1, 64)
- if fmt == 'e' {
- // clean up e-09 to e-9
- n := len(y)
- if n >= 4 && y[n-4] == 'e' && y[n-3] == '-' && y[n-2] == '0' {
- y[n-2] = y[n-1]
- y = y[:n-1]
- }
- }
-
- b = append(b, y...)
- case *objects.Int:
- b = strconv.AppendInt(b, o.Value, 10)
- case *objects.String:
- b = strconv.AppendQuote(b, o.Value)
- case *objects.Time:
- y, err := o.Value.MarshalJSON()
- if err != nil {
- return nil, err
- }
- b = append(b, y...)
- case *objects.Undefined:
- b = append(b, "null"...)
- default:
- // unknown type: ignore
- }
-
- return b, nil
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/json/scanner.go b/vendor/github.com/d5/tengo/stdlib/json/scanner.go
deleted file mode 100644
index 8fc6776d..00000000
--- a/vendor/github.com/d5/tengo/stdlib/json/scanner.go
+++ /dev/null
@@ -1,559 +0,0 @@
-// A modified version of Go's JSON implementation.
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import "strconv"
-
-func checkValid(data []byte, scan *scanner) error {
- scan.reset()
- for _, c := range data {
- scan.bytes++
- if scan.step(scan, c) == scanError {
- return scan.err
- }
- }
- if scan.eof() == scanError {
- return scan.err
- }
- return nil
-}
-
-// A SyntaxError is a description of a JSON syntax error.
-type SyntaxError struct {
- msg string // description of error
- Offset int64 // error occurred after reading Offset bytes
-}
-
-func (e *SyntaxError) Error() string { return e.msg }
-
-// A scanner is a JSON scanning state machine.
-// Callers call scan.reset() and then pass bytes in one at a time
-// by calling scan.step(&scan, c) for each byte.
-// The return value, referred to as an opcode, tells the
-// caller about significant parsing events like beginning
-// and ending literals, objects, and arrays, so that the
-// caller can follow along if it wishes.
-// The return value scanEnd indicates that a single top-level
-// JSON value has been completed, *before* the byte that
-// just got passed in. (The indication must be delayed in order
-// to recognize the end of numbers: is 123 a whole value or
-// the beginning of 12345e+6?).
-type scanner struct {
- // The step is a func to be called to execute the next transition.
- // Also tried using an integer constant and a single func
- // with a switch, but using the func directly was 10% faster
- // on a 64-bit Mac Mini, and it's nicer to read.
- step func(*scanner, byte) int
-
- // Reached end of top-level value.
- endTop bool
-
- // Stack of what we're in the middle of - array values, object keys, object values.
- parseState []int
-
- // Error that happened, if any.
- err error
-
- // total bytes consumed, updated by decoder.Decode
- bytes int64
-}
-
-// These values are returned by the state transition functions
-// assigned to scanner.state and the method scanner.eof.
-// They give details about the current state of the scan that
-// callers might be interested to know about.
-// It is okay to ignore the return value of any particular
-// call to scanner.state: if one call returns scanError,
-// every subsequent call will return scanError too.
-const (
- // Continue.
- scanContinue = iota // uninteresting byte
- scanBeginLiteral // end implied by next result != scanContinue
- scanBeginObject // begin object
- scanObjectKey // just finished object key (string)
- scanObjectValue // just finished non-last object value
- scanEndObject // end object (implies scanObjectValue if possible)
- scanBeginArray // begin array
- scanArrayValue // just finished array value
- scanEndArray // end array (implies scanArrayValue if possible)
- scanSkipSpace // space byte; can skip; known to be last "continue" result
-
- // Stop.
- scanEnd // top-level value ended *before* this byte; known to be first "stop" result
- scanError // hit an error, scanner.err.
-)
-
-// These values are stored in the parseState stack.
-// They give the current state of a composite value
-// being scanned. If the parser is inside a nested value
-// the parseState describes the nested state, outermost at entry 0.
-const (
- parseObjectKey = iota // parsing object key (before colon)
- parseObjectValue // parsing object value (after colon)
- parseArrayValue // parsing array value
-)
-
-// reset prepares the scanner for use.
-// It must be called before calling s.step.
-func (s *scanner) reset() {
- s.step = stateBeginValue
- s.parseState = s.parseState[0:0]
- s.err = nil
- s.endTop = false
-}
-
-// eof tells the scanner that the end of input has been reached.
-// It returns a scan status just as s.step does.
-func (s *scanner) eof() int {
- if s.err != nil {
- return scanError
- }
- if s.endTop {
- return scanEnd
- }
- s.step(s, ' ')
- if s.endTop {
- return scanEnd
- }
- if s.err == nil {
- s.err = &SyntaxError{"unexpected end of JSON input", s.bytes}
- }
- return scanError
-}
-
-// pushParseState pushes a new parse state p onto the parse stack.
-func (s *scanner) pushParseState(p int) {
- s.parseState = append(s.parseState, p)
-}
-
-// popParseState pops a parse state (already obtained) off the stack
-// and updates s.step accordingly.
-func (s *scanner) popParseState() {
- n := len(s.parseState) - 1
- s.parseState = s.parseState[0:n]
- if n == 0 {
- s.step = stateEndTop
- s.endTop = true
- } else {
- s.step = stateEndValue
- }
-}
-
-func isSpace(c byte) bool {
- return c == ' ' || c == '\t' || c == '\r' || c == '\n'
-}
-
-// stateBeginValueOrEmpty is the state after reading `[`.
-func stateBeginValueOrEmpty(s *scanner, c byte) int {
- if c <= ' ' && isSpace(c) {
- return scanSkipSpace
- }
- if c == ']' {
- return stateEndValue(s, c)
- }
- return stateBeginValue(s, c)
-}
-
-// stateBeginValue is the state at the beginning of the input.
-func stateBeginValue(s *scanner, c byte) int {
- if c <= ' ' && isSpace(c) {
- return scanSkipSpace
- }
- switch c {
- case '{':
- s.step = stateBeginStringOrEmpty
- s.pushParseState(parseObjectKey)
- return scanBeginObject
- case '[':
- s.step = stateBeginValueOrEmpty
- s.pushParseState(parseArrayValue)
- return scanBeginArray
- case '"':
- s.step = stateInString
- return scanBeginLiteral
- case '-':
- s.step = stateNeg
- return scanBeginLiteral
- case '0': // beginning of 0.123
- s.step = state0
- return scanBeginLiteral
- case 't': // beginning of true
- s.step = stateT
- return scanBeginLiteral
- case 'f': // beginning of false
- s.step = stateF
- return scanBeginLiteral
- case 'n': // beginning of null
- s.step = stateN
- return scanBeginLiteral
- }
- if '1' <= c && c <= '9' { // beginning of 1234.5
- s.step = state1
- return scanBeginLiteral
- }
- return s.error(c, "looking for beginning of value")
-}
-
-// stateBeginStringOrEmpty is the state after reading `{`.
-func stateBeginStringOrEmpty(s *scanner, c byte) int {
- if c <= ' ' && isSpace(c) {
- return scanSkipSpace
- }
- if c == '}' {
- n := len(s.parseState)
- s.parseState[n-1] = parseObjectValue
- return stateEndValue(s, c)
- }
- return stateBeginString(s, c)
-}
-
-// stateBeginString is the state after reading `{"key": value,`.
-func stateBeginString(s *scanner, c byte) int {
- if c <= ' ' && isSpace(c) {
- return scanSkipSpace
- }
- if c == '"' {
- s.step = stateInString
- return scanBeginLiteral
- }
- return s.error(c, "looking for beginning of object key string")
-}
-
-// stateEndValue is the state after completing a value,
-// such as after reading `{}` or `true` or `["x"`.
-func stateEndValue(s *scanner, c byte) int {
- n := len(s.parseState)
- if n == 0 {
- // Completed top-level before the current byte.
- s.step = stateEndTop
- s.endTop = true
- return stateEndTop(s, c)
- }
- if c <= ' ' && isSpace(c) {
- s.step = stateEndValue
- return scanSkipSpace
- }
- ps := s.parseState[n-1]
- switch ps {
- case parseObjectKey:
- if c == ':' {
- s.parseState[n-1] = parseObjectValue
- s.step = stateBeginValue
- return scanObjectKey
- }
- return s.error(c, "after object key")
- case parseObjectValue:
- if c == ',' {
- s.parseState[n-1] = parseObjectKey
- s.step = stateBeginString
- return scanObjectValue
- }
- if c == '}' {
- s.popParseState()
- return scanEndObject
- }
- return s.error(c, "after object key:value pair")
- case parseArrayValue:
- if c == ',' {
- s.step = stateBeginValue
- return scanArrayValue
- }
- if c == ']' {
- s.popParseState()
- return scanEndArray
- }
- return s.error(c, "after array element")
- }
- return s.error(c, "")
-}
-
-// stateEndTop is the state after finishing the top-level value,
-// such as after reading `{}` or `[1,2,3]`.
-// Only space characters should be seen now.
-func stateEndTop(s *scanner, c byte) int {
- if !isSpace(c) {
- // Complain about non-space byte on next call.
- s.error(c, "after top-level value")
- }
- return scanEnd
-}
-
-// stateInString is the state after reading `"`.
-func stateInString(s *scanner, c byte) int {
- if c == '"' {
- s.step = stateEndValue
- return scanContinue
- }
- if c == '\\' {
- s.step = stateInStringEsc
- return scanContinue
- }
- if c < 0x20 {
- return s.error(c, "in string literal")
- }
- return scanContinue
-}
-
-// stateInStringEsc is the state after reading `"\` during a quoted string.
-func stateInStringEsc(s *scanner, c byte) int {
- switch c {
- case 'b', 'f', 'n', 'r', 't', '\\', '/', '"':
- s.step = stateInString
- return scanContinue
- case 'u':
- s.step = stateInStringEscU
- return scanContinue
- }
- return s.error(c, "in string escape code")
-}
-
-// stateInStringEscU is the state after reading `"\u` during a quoted string.
-func stateInStringEscU(s *scanner, c byte) int {
- if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
- s.step = stateInStringEscU1
- return scanContinue
- }
- // numbers
- return s.error(c, "in \\u hexadecimal character escape")
-}
-
-// stateInStringEscU1 is the state after reading `"\u1` during a quoted string.
-func stateInStringEscU1(s *scanner, c byte) int {
- if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
- s.step = stateInStringEscU12
- return scanContinue
- }
- // numbers
- return s.error(c, "in \\u hexadecimal character escape")
-}
-
-// stateInStringEscU12 is the state after reading `"\u12` during a quoted string.
-func stateInStringEscU12(s *scanner, c byte) int {
- if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
- s.step = stateInStringEscU123
- return scanContinue
- }
- // numbers
- return s.error(c, "in \\u hexadecimal character escape")
-}
-
-// stateInStringEscU123 is the state after reading `"\u123` during a quoted string.
-func stateInStringEscU123(s *scanner, c byte) int {
- if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
- s.step = stateInString
- return scanContinue
- }
- // numbers
- return s.error(c, "in \\u hexadecimal character escape")
-}
-
-// stateNeg is the state after reading `-` during a number.
-func stateNeg(s *scanner, c byte) int {
- if c == '0' {
- s.step = state0
- return scanContinue
- }
- if '1' <= c && c <= '9' {
- s.step = state1
- return scanContinue
- }
- return s.error(c, "in numeric literal")
-}
-
-// state1 is the state after reading a non-zero integer during a number,
-// such as after reading `1` or `100` but not `0`.
-func state1(s *scanner, c byte) int {
- if '0' <= c && c <= '9' {
- s.step = state1
- return scanContinue
- }
- return state0(s, c)
-}
-
-// state0 is the state after reading `0` during a number.
-func state0(s *scanner, c byte) int {
- if c == '.' {
- s.step = stateDot
- return scanContinue
- }
- if c == 'e' || c == 'E' {
- s.step = stateE
- return scanContinue
- }
- return stateEndValue(s, c)
-}
-
-// stateDot is the state after reading the integer and decimal point in a number,
-// such as after reading `1.`.
-func stateDot(s *scanner, c byte) int {
- if '0' <= c && c <= '9' {
- s.step = stateDot0
- return scanContinue
- }
- return s.error(c, "after decimal point in numeric literal")
-}
-
-// stateDot0 is the state after reading the integer, decimal point, and subsequent
-// digits of a number, such as after reading `3.14`.
-func stateDot0(s *scanner, c byte) int {
- if '0' <= c && c <= '9' {
- return scanContinue
- }
- if c == 'e' || c == 'E' {
- s.step = stateE
- return scanContinue
- }
- return stateEndValue(s, c)
-}
-
-// stateE is the state after reading the mantissa and e in a number,
-// such as after reading `314e` or `0.314e`.
-func stateE(s *scanner, c byte) int {
- if c == '+' || c == '-' {
- s.step = stateESign
- return scanContinue
- }
- return stateESign(s, c)
-}
-
-// stateESign is the state after reading the mantissa, e, and sign in a number,
-// such as after reading `314e-` or `0.314e+`.
-func stateESign(s *scanner, c byte) int {
- if '0' <= c && c <= '9' {
- s.step = stateE0
- return scanContinue
- }
- return s.error(c, "in exponent of numeric literal")
-}
-
-// stateE0 is the state after reading the mantissa, e, optional sign,
-// and at least one digit of the exponent in a number,
-// such as after reading `314e-2` or `0.314e+1` or `3.14e0`.
-func stateE0(s *scanner, c byte) int {
- if '0' <= c && c <= '9' {
- return scanContinue
- }
- return stateEndValue(s, c)
-}
-
-// stateT is the state after reading `t`.
-func stateT(s *scanner, c byte) int {
- if c == 'r' {
- s.step = stateTr
- return scanContinue
- }
- return s.error(c, "in literal true (expecting 'r')")
-}
-
-// stateTr is the state after reading `tr`.
-func stateTr(s *scanner, c byte) int {
- if c == 'u' {
- s.step = stateTru
- return scanContinue
- }
- return s.error(c, "in literal true (expecting 'u')")
-}
-
-// stateTru is the state after reading `tru`.
-func stateTru(s *scanner, c byte) int {
- if c == 'e' {
- s.step = stateEndValue
- return scanContinue
- }
- return s.error(c, "in literal true (expecting 'e')")
-}
-
-// stateF is the state after reading `f`.
-func stateF(s *scanner, c byte) int {
- if c == 'a' {
- s.step = stateFa
- return scanContinue
- }
- return s.error(c, "in literal false (expecting 'a')")
-}
-
-// stateFa is the state after reading `fa`.
-func stateFa(s *scanner, c byte) int {
- if c == 'l' {
- s.step = stateFal
- return scanContinue
- }
- return s.error(c, "in literal false (expecting 'l')")
-}
-
-// stateFal is the state after reading `fal`.
-func stateFal(s *scanner, c byte) int {
- if c == 's' {
- s.step = stateFals
- return scanContinue
- }
- return s.error(c, "in literal false (expecting 's')")
-}
-
-// stateFals is the state after reading `fals`.
-func stateFals(s *scanner, c byte) int {
- if c == 'e' {
- s.step = stateEndValue
- return scanContinue
- }
- return s.error(c, "in literal false (expecting 'e')")
-}
-
-// stateN is the state after reading `n`.
-func stateN(s *scanner, c byte) int {
- if c == 'u' {
- s.step = stateNu
- return scanContinue
- }
- return s.error(c, "in literal null (expecting 'u')")
-}
-
-// stateNu is the state after reading `nu`.
-func stateNu(s *scanner, c byte) int {
- if c == 'l' {
- s.step = stateNul
- return scanContinue
- }
- return s.error(c, "in literal null (expecting 'l')")
-}
-
-// stateNul is the state after reading `nul`.
-func stateNul(s *scanner, c byte) int {
- if c == 'l' {
- s.step = stateEndValue
- return scanContinue
- }
- return s.error(c, "in literal null (expecting 'l')")
-}
-
-// stateError is the state after reaching a syntax error,
-// such as after reading `[1}` or `5.1.2`.
-func stateError(s *scanner, c byte) int {
- return scanError
-}
-
-// error records an error and switches to the error state.
-func (s *scanner) error(c byte, context string) int {
- s.step = stateError
- s.err = &SyntaxError{"invalid character " + quoteChar(c) + " " + context, s.bytes}
- return scanError
-}
-
-// quoteChar formats c as a quoted character literal
-func quoteChar(c byte) string {
- // special cases - different from quoted strings
- if c == '\'' {
- return `'\''`
- }
- if c == '"' {
- return `'"'`
- }
-
- // use quoted string with different quotation marks
- s := strconv.Quote(string(c))
- return "'" + s[1:len(s)-1] + "'"
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/math.go b/vendor/github.com/d5/tengo/stdlib/math.go
deleted file mode 100644
index 08d82bdf..00000000
--- a/vendor/github.com/d5/tengo/stdlib/math.go
+++ /dev/null
@@ -1,74 +0,0 @@
-package stdlib
-
-import (
- "math"
-
- "github.com/d5/tengo/objects"
-)
-
-var mathModule = map[string]objects.Object{
- "e": &objects.Float{Value: math.E},
- "pi": &objects.Float{Value: math.Pi},
- "phi": &objects.Float{Value: math.Phi},
- "sqrt2": &objects.Float{Value: math.Sqrt2},
- "sqrtE": &objects.Float{Value: math.SqrtE},
- "sqrtPi": &objects.Float{Value: math.SqrtPi},
- "sqrtPhi": &objects.Float{Value: math.SqrtPhi},
- "ln2": &objects.Float{Value: math.Ln2},
- "log2E": &objects.Float{Value: math.Log2E},
- "ln10": &objects.Float{Value: math.Ln10},
- "log10E": &objects.Float{Value: math.Log10E},
- "abs": &objects.UserFunction{Name: "abs", Value: FuncAFRF(math.Abs)},
- "acos": &objects.UserFunction{Name: "acos", Value: FuncAFRF(math.Acos)},
- "acosh": &objects.UserFunction{Name: "acosh", Value: FuncAFRF(math.Acosh)},
- "asin": &objects.UserFunction{Name: "asin", Value: FuncAFRF(math.Asin)},
- "asinh": &objects.UserFunction{Name: "asinh", Value: FuncAFRF(math.Asinh)},
- "atan": &objects.UserFunction{Name: "atan", Value: FuncAFRF(math.Atan)},
- "atan2": &objects.UserFunction{Name: "atan2", Value: FuncAFFRF(math.Atan2)},
- "atanh": &objects.UserFunction{Name: "atanh", Value: FuncAFRF(math.Atanh)},
- "cbrt": &objects.UserFunction{Name: "cbrt", Value: FuncAFRF(math.Cbrt)},
- "ceil": &objects.UserFunction{Name: "ceil", Value: FuncAFRF(math.Ceil)},
- "copysign": &objects.UserFunction{Name: "copysign", Value: FuncAFFRF(math.Copysign)},
- "cos": &objects.UserFunction{Name: "cos", Value: FuncAFRF(math.Cos)},
- "cosh": &objects.UserFunction{Name: "cosh", Value: FuncAFRF(math.Cosh)},
- "dim": &objects.UserFunction{Name: "dim", Value: FuncAFFRF(math.Dim)},
- "erf": &objects.UserFunction{Name: "erf", Value: FuncAFRF(math.Erf)},
- "erfc": &objects.UserFunction{Name: "erfc", Value: FuncAFRF(math.Erfc)},
- "exp": &objects.UserFunction{Name: "exp", Value: FuncAFRF(math.Exp)},
- "exp2": &objects.UserFunction{Name: "exp2", Value: FuncAFRF(math.Exp2)},
- "expm1": &objects.UserFunction{Name: "expm1", Value: FuncAFRF(math.Expm1)},
- "floor": &objects.UserFunction{Name: "floor", Value: FuncAFRF(math.Floor)},
- "gamma": &objects.UserFunction{Name: "gamma", Value: FuncAFRF(math.Gamma)},
- "hypot": &objects.UserFunction{Name: "hypot", Value: FuncAFFRF(math.Hypot)},
- "ilogb": &objects.UserFunction{Name: "ilogb", Value: FuncAFRI(math.Ilogb)},
- "inf": &objects.UserFunction{Name: "inf", Value: FuncAIRF(math.Inf)},
- "is_inf": &objects.UserFunction{Name: "is_inf", Value: FuncAFIRB(math.IsInf)},
- "is_nan": &objects.UserFunction{Name: "is_nan", Value: FuncAFRB(math.IsNaN)},
- "j0": &objects.UserFunction{Name: "j0", Value: FuncAFRF(math.J0)},
- "j1": &objects.UserFunction{Name: "j1", Value: FuncAFRF(math.J1)},
- "jn": &objects.UserFunction{Name: "jn", Value: FuncAIFRF(math.Jn)},
- "ldexp": &objects.UserFunction{Name: "ldexp", Value: FuncAFIRF(math.Ldexp)},
- "log": &objects.UserFunction{Name: "log", Value: FuncAFRF(math.Log)},
- "log10": &objects.UserFunction{Name: "log10", Value: FuncAFRF(math.Log10)},
- "log1p": &objects.UserFunction{Name: "log1p", Value: FuncAFRF(math.Log1p)},
- "log2": &objects.UserFunction{Name: "log2", Value: FuncAFRF(math.Log2)},
- "logb": &objects.UserFunction{Name: "logb", Value: FuncAFRF(math.Logb)},
- "max": &objects.UserFunction{Name: "max", Value: FuncAFFRF(math.Max)},
- "min": &objects.UserFunction{Name: "min", Value: FuncAFFRF(math.Min)},
- "mod": &objects.UserFunction{Name: "mod", Value: FuncAFFRF(math.Mod)},
- "nan": &objects.UserFunction{Name: "nan", Value: FuncARF(math.NaN)},
- "nextafter": &objects.UserFunction{Name: "nextafter", Value: FuncAFFRF(math.Nextafter)},
- "pow": &objects.UserFunction{Name: "pow", Value: FuncAFFRF(math.Pow)},
- "pow10": &objects.UserFunction{Name: "pow10", Value: FuncAIRF(math.Pow10)},
- "remainder": &objects.UserFunction{Name: "remainder", Value: FuncAFFRF(math.Remainder)},
- "signbit": &objects.UserFunction{Name: "signbit", Value: FuncAFRB(math.Signbit)},
- "sin": &objects.UserFunction{Name: "sin", Value: FuncAFRF(math.Sin)},
- "sinh": &objects.UserFunction{Name: "sinh", Value: FuncAFRF(math.Sinh)},
- "sqrt": &objects.UserFunction{Name: "sqrt", Value: FuncAFRF(math.Sqrt)},
- "tan": &objects.UserFunction{Name: "tan", Value: FuncAFRF(math.Tan)},
- "tanh": &objects.UserFunction{Name: "tanh", Value: FuncAFRF(math.Tanh)},
- "trunc": &objects.UserFunction{Name: "trunc", Value: FuncAFRF(math.Trunc)},
- "y0": &objects.UserFunction{Name: "y0", Value: FuncAFRF(math.Y0)},
- "y1": &objects.UserFunction{Name: "y1", Value: FuncAFRF(math.Y1)},
- "yn": &objects.UserFunction{Name: "yn", Value: FuncAIFRF(math.Yn)},
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/os.go b/vendor/github.com/d5/tengo/stdlib/os.go
deleted file mode 100644
index a7890cc1..00000000
--- a/vendor/github.com/d5/tengo/stdlib/os.go
+++ /dev/null
@@ -1,492 +0,0 @@
-package stdlib
-
-import (
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
-
- "github.com/d5/tengo"
- "github.com/d5/tengo/objects"
-)
-
-var osModule = map[string]objects.Object{
- "o_rdonly": &objects.Int{Value: int64(os.O_RDONLY)},
- "o_wronly": &objects.Int{Value: int64(os.O_WRONLY)},
- "o_rdwr": &objects.Int{Value: int64(os.O_RDWR)},
- "o_append": &objects.Int{Value: int64(os.O_APPEND)},
- "o_create": &objects.Int{Value: int64(os.O_CREATE)},
- "o_excl": &objects.Int{Value: int64(os.O_EXCL)},
- "o_sync": &objects.Int{Value: int64(os.O_SYNC)},
- "o_trunc": &objects.Int{Value: int64(os.O_TRUNC)},
- "mode_dir": &objects.Int{Value: int64(os.ModeDir)},
- "mode_append": &objects.Int{Value: int64(os.ModeAppend)},
- "mode_exclusive": &objects.Int{Value: int64(os.ModeExclusive)},
- "mode_temporary": &objects.Int{Value: int64(os.ModeTemporary)},
- "mode_symlink": &objects.Int{Value: int64(os.ModeSymlink)},
- "mode_device": &objects.Int{Value: int64(os.ModeDevice)},
- "mode_named_pipe": &objects.Int{Value: int64(os.ModeNamedPipe)},
- "mode_socket": &objects.Int{Value: int64(os.ModeSocket)},
- "mode_setuid": &objects.Int{Value: int64(os.ModeSetuid)},
- "mode_setgui": &objects.Int{Value: int64(os.ModeSetgid)},
- "mode_char_device": &objects.Int{Value: int64(os.ModeCharDevice)},
- "mode_sticky": &objects.Int{Value: int64(os.ModeSticky)},
- "mode_type": &objects.Int{Value: int64(os.ModeType)},
- "mode_perm": &objects.Int{Value: int64(os.ModePerm)},
- "path_separator": &objects.Char{Value: os.PathSeparator},
- "path_list_separator": &objects.Char{Value: os.PathListSeparator},
- "dev_null": &objects.String{Value: os.DevNull},
- "seek_set": &objects.Int{Value: int64(io.SeekStart)},
- "seek_cur": &objects.Int{Value: int64(io.SeekCurrent)},
- "seek_end": &objects.Int{Value: int64(io.SeekEnd)},
- "args": &objects.UserFunction{Name: "args", Value: osArgs}, // args() => array(string)
- "chdir": &objects.UserFunction{Name: "chdir", Value: FuncASRE(os.Chdir)}, // chdir(dir string) => error
- "chmod": osFuncASFmRE("chmod", os.Chmod), // chmod(name string, mode int) => error
- "chown": &objects.UserFunction{Name: "chown", Value: FuncASIIRE(os.Chown)}, // chown(name string, uid int, gid int) => error
- "clearenv": &objects.UserFunction{Name: "clearenv", Value: FuncAR(os.Clearenv)}, // clearenv()
- "environ": &objects.UserFunction{Name: "environ", Value: FuncARSs(os.Environ)}, // environ() => array(string)
- "exit": &objects.UserFunction{Name: "exit", Value: FuncAIR(os.Exit)}, // exit(code int)
- "expand_env": &objects.UserFunction{Name: "expand_env", Value: osExpandEnv}, // expand_env(s string) => string
- "getegid": &objects.UserFunction{Name: "getegid", Value: FuncARI(os.Getegid)}, // getegid() => int
- "getenv": &objects.UserFunction{Name: "getenv", Value: FuncASRS(os.Getenv)}, // getenv(s string) => string
- "geteuid": &objects.UserFunction{Name: "geteuid", Value: FuncARI(os.Geteuid)}, // geteuid() => int
- "getgid": &objects.UserFunction{Name: "getgid", Value: FuncARI(os.Getgid)}, // getgid() => int
- "getgroups": &objects.UserFunction{Name: "getgroups", Value: FuncARIsE(os.Getgroups)}, // getgroups() => array(string)/error
- "getpagesize": &objects.UserFunction{Name: "getpagesize", Value: FuncARI(os.Getpagesize)}, // getpagesize() => int
- "getpid": &objects.UserFunction{Name: "getpid", Value: FuncARI(os.Getpid)}, // getpid() => int
- "getppid": &objects.UserFunction{Name: "getppid", Value: FuncARI(os.Getppid)}, // getppid() => int
- "getuid": &objects.UserFunction{Name: "getuid", Value: FuncARI(os.Getuid)}, // getuid() => int
- "getwd": &objects.UserFunction{Name: "getwd", Value: FuncARSE(os.Getwd)}, // getwd() => string/error
- "hostname": &objects.UserFunction{Name: "hostname", Value: FuncARSE(os.Hostname)}, // hostname() => string/error
- "lchown": &objects.UserFunction{Name: "lchown", Value: FuncASIIRE(os.Lchown)}, // lchown(name string, uid int, gid int) => error
- "link": &objects.UserFunction{Name: "link", Value: FuncASSRE(os.Link)}, // link(oldname string, newname string) => error
- "lookup_env": &objects.UserFunction{Name: "lookup_env", Value: osLookupEnv}, // lookup_env(key string) => string/false
- "mkdir": osFuncASFmRE("mkdir", os.Mkdir), // mkdir(name string, perm int) => error
- "mkdir_all": osFuncASFmRE("mkdir_all", os.MkdirAll), // mkdir_all(name string, perm int) => error
- "readlink": &objects.UserFunction{Name: "readlink", Value: FuncASRSE(os.Readlink)}, // readlink(name string) => string/error
- "remove": &objects.UserFunction{Name: "remove", Value: FuncASRE(os.Remove)}, // remove(name string) => error
- "remove_all": &objects.UserFunction{Name: "remove_all", Value: FuncASRE(os.RemoveAll)}, // remove_all(name string) => error
- "rename": &objects.UserFunction{Name: "rename", Value: FuncASSRE(os.Rename)}, // rename(oldpath string, newpath string) => error
- "setenv": &objects.UserFunction{Name: "setenv", Value: FuncASSRE(os.Setenv)}, // setenv(key string, value string) => error
- "symlink": &objects.UserFunction{Name: "symlink", Value: FuncASSRE(os.Symlink)}, // symlink(oldname string newname string) => error
- "temp_dir": &objects.UserFunction{Name: "temp_dir", Value: FuncARS(os.TempDir)}, // temp_dir() => string
- "truncate": &objects.UserFunction{Name: "truncate", Value: FuncASI64RE(os.Truncate)}, // truncate(name string, size int) => error
- "unsetenv": &objects.UserFunction{Name: "unsetenv", Value: FuncASRE(os.Unsetenv)}, // unsetenv(key string) => error
- "create": &objects.UserFunction{Name: "create", Value: osCreate}, // create(name string) => imap(file)/error
- "open": &objects.UserFunction{Name: "open", Value: osOpen}, // open(name string) => imap(file)/error
- "open_file": &objects.UserFunction{Name: "open_file", Value: osOpenFile}, // open_file(name string, flag int, perm int) => imap(file)/error
- "find_process": &objects.UserFunction{Name: "find_process", Value: osFindProcess}, // find_process(pid int) => imap(process)/error
- "start_process": &objects.UserFunction{Name: "start_process", Value: osStartProcess}, // start_process(name string, argv array(string), dir string, env array(string)) => imap(process)/error
- "exec_look_path": &objects.UserFunction{Name: "exec_look_path", Value: FuncASRSE(exec.LookPath)}, // exec_look_path(file) => string/error
- "exec": &objects.UserFunction{Name: "exec", Value: osExec}, // exec(name, args...) => command
- "stat": &objects.UserFunction{Name: "stat", Value: osStat}, // stat(name) => imap(fileinfo)/error
- "read_file": &objects.UserFunction{Name: "read_file", Value: osReadFile}, // readfile(name) => array(byte)/error
-}
-
-func osReadFile(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- fname, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- bytes, err := ioutil.ReadFile(fname)
- if err != nil {
- return wrapError(err), nil
- }
-
- if len(bytes) > tengo.MaxBytesLen {
- return nil, objects.ErrBytesLimit
- }
-
- return &objects.Bytes{Value: bytes}, nil
-}
-
-func osStat(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- fname, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- stat, err := os.Stat(fname)
- if err != nil {
- return wrapError(err), nil
- }
-
- fstat := &objects.ImmutableMap{
- Value: map[string]objects.Object{
- "name": &objects.String{Value: stat.Name()},
- "mtime": &objects.Time{Value: stat.ModTime()},
- "size": &objects.Int{Value: stat.Size()},
- "mode": &objects.Int{Value: int64(stat.Mode())},
- },
- }
-
- if stat.IsDir() {
- fstat.Value["directory"] = objects.TrueValue
- } else {
- fstat.Value["directory"] = objects.FalseValue
- }
-
- return fstat, nil
-}
-
-func osCreate(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := os.Create(s1)
- if err != nil {
- return wrapError(err), nil
- }
-
- return makeOSFile(res), nil
-}
-
-func osOpen(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := os.Open(s1)
- if err != nil {
- return wrapError(err), nil
- }
-
- return makeOSFile(res), nil
-}
-
-func osOpenFile(args ...objects.Object) (objects.Object, error) {
- if len(args) != 3 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- i3, ok := objects.ToInt(args[2])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- }
-
- res, err := os.OpenFile(s1, i2, os.FileMode(i3))
- if err != nil {
- return wrapError(err), nil
- }
-
- return makeOSFile(res), nil
-}
-
-func osArgs(args ...objects.Object) (objects.Object, error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- arr := &objects.Array{}
- for _, osArg := range os.Args {
- if len(osArg) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- arr.Value = append(arr.Value, &objects.String{Value: osArg})
- }
-
- return arr, nil
-}
-
-func osFuncASFmRE(name string, fn func(string, os.FileMode) error) *objects.UserFunction {
- return &objects.UserFunction{
- Name: name,
- Value: func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
- i2, ok := objects.ToInt64(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- return wrapError(fn(s1, os.FileMode(i2))), nil
- },
- }
-}
-
-func osLookupEnv(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- res, ok := os.LookupEnv(s1)
- if !ok {
- return objects.FalseValue, nil
- }
-
- if len(res) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: res}, nil
-}
-
-func osExpandEnv(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- var vlen int
- var failed bool
- s := os.Expand(s1, func(k string) string {
- if failed {
- return ""
- }
-
- v := os.Getenv(k)
-
- // this does not count the other texts that are not being replaced
- // but the code checks the final length at the end
- vlen += len(v)
- if vlen > tengo.MaxStringLen {
- failed = true
- return ""
- }
-
- return v
- })
-
- if failed || len(s) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: s}, nil
-}
-
-func osExec(args ...objects.Object) (objects.Object, error) {
- if len(args) == 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- name, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- var execArgs []string
- for idx, arg := range args[1:] {
- execArg, ok := objects.ToString(arg)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: fmt.Sprintf("args[%d]", idx),
- Expected: "string(compatible)",
- Found: args[1+idx].TypeName(),
- }
- }
-
- execArgs = append(execArgs, execArg)
- }
-
- return makeOSExecCommand(exec.Command(name, execArgs...)), nil
-}
-
-func osFindProcess(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- proc, err := os.FindProcess(i1)
- if err != nil {
- return wrapError(err), nil
- }
-
- return makeOSProcess(proc), nil
-}
-
-func osStartProcess(args ...objects.Object) (objects.Object, error) {
- if len(args) != 4 {
- return nil, objects.ErrWrongNumArguments
- }
-
- name, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- var argv []string
- var err error
- switch arg1 := args[1].(type) {
- case *objects.Array:
- argv, err = stringArray(arg1.Value, "second")
- if err != nil {
- return nil, err
- }
- case *objects.ImmutableArray:
- argv, err = stringArray(arg1.Value, "second")
- if err != nil {
- return nil, err
- }
- default:
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "array",
- Found: arg1.TypeName(),
- }
- }
-
- dir, ok := objects.ToString(args[2])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "string(compatible)",
- Found: args[2].TypeName(),
- }
- }
-
- var env []string
- switch arg3 := args[3].(type) {
- case *objects.Array:
- env, err = stringArray(arg3.Value, "fourth")
- if err != nil {
- return nil, err
- }
- case *objects.ImmutableArray:
- env, err = stringArray(arg3.Value, "fourth")
- if err != nil {
- return nil, err
- }
- default:
- return nil, objects.ErrInvalidArgumentType{
- Name: "fourth",
- Expected: "array",
- Found: arg3.TypeName(),
- }
- }
-
- proc, err := os.StartProcess(name, argv, &os.ProcAttr{
- Dir: dir,
- Env: env,
- })
- if err != nil {
- return wrapError(err), nil
- }
-
- return makeOSProcess(proc), nil
-}
-
-func stringArray(arr []objects.Object, argName string) ([]string, error) {
- var sarr []string
- for idx, elem := range arr {
- str, ok := elem.(*objects.String)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: fmt.Sprintf("%s[%d]", argName, idx),
- Expected: "string",
- Found: elem.TypeName(),
- }
- }
-
- sarr = append(sarr, str.Value)
- }
-
- return sarr, nil
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/os_exec.go b/vendor/github.com/d5/tengo/stdlib/os_exec.go
deleted file mode 100644
index 5274c36a..00000000
--- a/vendor/github.com/d5/tengo/stdlib/os_exec.go
+++ /dev/null
@@ -1,113 +0,0 @@
-package stdlib
-
-import (
- "os/exec"
-
- "github.com/d5/tengo/objects"
-)
-
-func makeOSExecCommand(cmd *exec.Cmd) *objects.ImmutableMap {
- return &objects.ImmutableMap{
- Value: map[string]objects.Object{
- // combined_output() => bytes/error
- "combined_output": &objects.UserFunction{Name: "combined_output", Value: FuncARYE(cmd.CombinedOutput)}, //
- // output() => bytes/error
- "output": &objects.UserFunction{Name: "output", Value: FuncARYE(cmd.Output)}, //
- // run() => error
- "run": &objects.UserFunction{Name: "run", Value: FuncARE(cmd.Run)}, //
- // start() => error
- "start": &objects.UserFunction{Name: "start", Value: FuncARE(cmd.Start)}, //
- // wait() => error
- "wait": &objects.UserFunction{Name: "wait", Value: FuncARE(cmd.Wait)}, //
- // set_path(path string)
- "set_path": &objects.UserFunction{
- Name: "set_path",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- cmd.Path = s1
-
- return objects.UndefinedValue, nil
- },
- },
- // set_dir(dir string)
- "set_dir": &objects.UserFunction{
- Name: "set_dir",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- cmd.Dir = s1
-
- return objects.UndefinedValue, nil
- },
- },
- // set_env(env array(string))
- "set_env": &objects.UserFunction{
- Name: "set_env",
- Value: func(args ...objects.Object) (objects.Object, error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- var env []string
- var err error
- switch arg0 := args[0].(type) {
- case *objects.Array:
- env, err = stringArray(arg0.Value, "first")
- if err != nil {
- return nil, err
- }
- case *objects.ImmutableArray:
- env, err = stringArray(arg0.Value, "first")
- if err != nil {
- return nil, err
- }
- default:
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "array",
- Found: arg0.TypeName(),
- }
- }
-
- cmd.Env = env
-
- return objects.UndefinedValue, nil
- },
- },
- // process() => imap(process)
- "process": &objects.UserFunction{
- Name: "process",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- return makeOSProcess(cmd.Process), nil
- },
- },
- },
- }
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/os_file.go b/vendor/github.com/d5/tengo/stdlib/os_file.go
deleted file mode 100644
index ee9f625a..00000000
--- a/vendor/github.com/d5/tengo/stdlib/os_file.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package stdlib
-
-import (
- "os"
-
- "github.com/d5/tengo/objects"
-)
-
-func makeOSFile(file *os.File) *objects.ImmutableMap {
- return &objects.ImmutableMap{
- Value: map[string]objects.Object{
- // chdir() => true/error
- "chdir": &objects.UserFunction{Name: "chdir", Value: FuncARE(file.Chdir)}, //
- // chown(uid int, gid int) => true/error
- "chown": &objects.UserFunction{Name: "chown", Value: FuncAIIRE(file.Chown)}, //
- // close() => error
- "close": &objects.UserFunction{Name: "close", Value: FuncARE(file.Close)}, //
- // name() => string
- "name": &objects.UserFunction{Name: "name", Value: FuncARS(file.Name)}, //
- // readdirnames(n int) => array(string)/error
- "readdirnames": &objects.UserFunction{Name: "readdirnames", Value: FuncAIRSsE(file.Readdirnames)}, //
- // sync() => error
- "sync": &objects.UserFunction{Name: "sync", Value: FuncARE(file.Sync)}, //
- // write(bytes) => int/error
- "write": &objects.UserFunction{Name: "write", Value: FuncAYRIE(file.Write)}, //
- // write(string) => int/error
- "write_string": &objects.UserFunction{Name: "write_string", Value: FuncASRIE(file.WriteString)}, //
- // read(bytes) => int/error
- "read": &objects.UserFunction{Name: "read", Value: FuncAYRIE(file.Read)}, //
- // chmod(mode int) => error
- "chmod": &objects.UserFunction{
- Name: "chmod",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- return wrapError(file.Chmod(os.FileMode(i1))), nil
- },
- },
- // seek(offset int, whence int) => int/error
- "seek": &objects.UserFunction{
- Name: "seek",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
- i2, ok := objects.ToInt(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- res, err := file.Seek(i1, i2)
- if err != nil {
- return wrapError(err), nil
- }
-
- return &objects.Int{Value: res}, nil
- },
- },
- // stat() => imap(fileinfo)/error
- "stat": &objects.UserFunction{
- Name: "start",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- return osStat(&objects.String{Value: file.Name()})
- },
- },
- },
- }
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/os_process.go b/vendor/github.com/d5/tengo/stdlib/os_process.go
deleted file mode 100644
index 801ccdef..00000000
--- a/vendor/github.com/d5/tengo/stdlib/os_process.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package stdlib
-
-import (
- "os"
- "syscall"
-
- "github.com/d5/tengo/objects"
-)
-
-func makeOSProcessState(state *os.ProcessState) *objects.ImmutableMap {
- return &objects.ImmutableMap{
- Value: map[string]objects.Object{
- "exited": &objects.UserFunction{Name: "exited", Value: FuncARB(state.Exited)}, //
- "pid": &objects.UserFunction{Name: "pid", Value: FuncARI(state.Pid)}, //
- "string": &objects.UserFunction{Name: "string", Value: FuncARS(state.String)}, //
- "success": &objects.UserFunction{Name: "success", Value: FuncARB(state.Success)}, //
- },
- }
-}
-
-func makeOSProcess(proc *os.Process) *objects.ImmutableMap {
- return &objects.ImmutableMap{
- Value: map[string]objects.Object{
- "kill": &objects.UserFunction{Name: "kill", Value: FuncARE(proc.Kill)}, //
- "release": &objects.UserFunction{Name: "release", Value: FuncARE(proc.Release)}, //
- "signal": &objects.UserFunction{
- Name: "signal",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- return wrapError(proc.Signal(syscall.Signal(i1))), nil
- },
- },
- "wait": &objects.UserFunction{
- Name: "wait",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- return nil, objects.ErrWrongNumArguments
- }
-
- state, err := proc.Wait()
- if err != nil {
- return wrapError(err), nil
- }
-
- return makeOSProcessState(state), nil
- },
- },
- },
- }
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/rand.go b/vendor/github.com/d5/tengo/stdlib/rand.go
deleted file mode 100644
index 6efe1de8..00000000
--- a/vendor/github.com/d5/tengo/stdlib/rand.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package stdlib
-
-import (
- "math/rand"
-
- "github.com/d5/tengo/objects"
-)
-
-var randModule = map[string]objects.Object{
- "int": &objects.UserFunction{Name: "int", Value: FuncARI64(rand.Int63)},
- "float": &objects.UserFunction{Name: "float", Value: FuncARF(rand.Float64)},
- "intn": &objects.UserFunction{Name: "intn", Value: FuncAI64RI64(rand.Int63n)},
- "exp_float": &objects.UserFunction{Name: "exp_float", Value: FuncARF(rand.ExpFloat64)},
- "norm_float": &objects.UserFunction{Name: "norm_float", Value: FuncARF(rand.NormFloat64)},
- "perm": &objects.UserFunction{Name: "perm", Value: FuncAIRIs(rand.Perm)},
- "seed": &objects.UserFunction{Name: "seed", Value: FuncAI64R(rand.Seed)},
- "read": &objects.UserFunction{
- Name: "read",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- y1, ok := args[0].(*objects.Bytes)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "bytes",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := rand.Read(y1.Value)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- return &objects.Int{Value: int64(res)}, nil
- },
- },
- "rand": &objects.UserFunction{
- Name: "rand",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- src := rand.NewSource(i1)
-
- return randRand(rand.New(src)), nil
- },
- },
-}
-
-func randRand(r *rand.Rand) *objects.ImmutableMap {
- return &objects.ImmutableMap{
- Value: map[string]objects.Object{
- "int": &objects.UserFunction{Name: "int", Value: FuncARI64(r.Int63)},
- "float": &objects.UserFunction{Name: "float", Value: FuncARF(r.Float64)},
- "intn": &objects.UserFunction{Name: "intn", Value: FuncAI64RI64(r.Int63n)},
- "exp_float": &objects.UserFunction{Name: "exp_float", Value: FuncARF(r.ExpFloat64)},
- "norm_float": &objects.UserFunction{Name: "norm_float", Value: FuncARF(r.NormFloat64)},
- "perm": &objects.UserFunction{Name: "perm", Value: FuncAIRIs(r.Perm)},
- "seed": &objects.UserFunction{Name: "seed", Value: FuncAI64R(r.Seed)},
- "read": &objects.UserFunction{
- Name: "read",
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- return nil, objects.ErrWrongNumArguments
- }
-
- y1, ok := args[0].(*objects.Bytes)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "bytes",
- Found: args[0].TypeName(),
- }
- }
-
- res, err := r.Read(y1.Value)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- return &objects.Int{Value: int64(res)}, nil
- },
- },
- },
- }
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/source_modules.go b/vendor/github.com/d5/tengo/stdlib/source_modules.go
deleted file mode 100644
index ca69d7d1..00000000
--- a/vendor/github.com/d5/tengo/stdlib/source_modules.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Code generated using gensrcmods.go; DO NOT EDIT.
-
-package stdlib
-
-// SourceModules are source type standard library modules.
-var SourceModules = map[string]string{
- "enum": "is_enumerable := func(x) {\n return is_array(x) || is_map(x) || is_immutable_array(x) || is_immutable_map(x)\n}\n\nis_array_like := func(x) {\n return is_array(x) || is_immutable_array(x)\n}\n\nexport {\n // all returns true if the given function `fn` evaluates to a truthy value on\n // all of the items in `x`. It returns undefined if `x` is not enumerable.\n all: func(x, fn) {\n if !is_enumerable(x) { return undefined }\n\n for k, v in x {\n if !fn(k, v) { return false }\n }\n\n return true\n },\n // any returns true if the given function `fn` evaluates to a truthy value on\n // any of the items in `x`. It returns undefined if `x` is not enumerable.\n any: func(x, fn) {\n if !is_enumerable(x) { return undefined }\n\n for k, v in x {\n if fn(k, v) { return true }\n }\n\n return false\n },\n // chunk returns an array of elements split into groups the length of size.\n // If `x` can't be split evenly, the final chunk will be the remaining elements.\n // It returns undefined if `x` is not array.\n chunk: func(x, size) {\n if !is_array_like(x) || !size { return undefined }\n\n numElements := len(x)\n if !numElements { return [] }\n\n res := []\n idx := 0\n for idx < numElements {\n res = append(res, x[idx:idx+size])\n idx += size\n }\n\n return res\n },\n // at returns an element at the given index (if `x` is array) or\n // key (if `x` is map). It returns undefined if `x` is not enumerable.\n at: func(x, key) {\n if !is_enumerable(x) { return undefined }\n\n if is_array_like(x) {\n if !is_int(key) { return undefined }\n } else {\n if !is_string(key) { return undefined }\n }\n\n return x[key]\n },\n // each iterates over elements of `x` and invokes `fn` for each element. `fn` is\n // invoked with two arguments: `key` and `value`. `key` is an int index\n // if `x` is array. `key` is a string key if `x` is map. It does not iterate\n // and returns undefined if `x` is not enumerable.\n each: func(x, fn) {\n if !is_enumerable(x) { return undefined }\n\n for k, v in x {\n fn(k, v)\n }\n },\n // filter iterates over elements of `x`, returning an array of all elements `fn`\n // returns truthy for. `fn` is invoked with two arguments: `key` and `value`.\n // `key` is an int index if `x` is array. `key` is a string key if `x` is map.\n // It returns undefined if `x` is not enumerable.\n filter: func(x, fn) {\n if !is_array_like(x) { return undefined }\n\n dst := []\n for k, v in x {\n if fn(k, v) { dst = append(dst, v) }\n }\n\n return dst\n },\n // find iterates over elements of `x`, returning value of the first element `fn`\n // returns truthy for. `fn` is invoked with two arguments: `key` and `value`.\n // `key` is an int index if `x` is array. `key` is a string key if `x` is map.\n // It returns undefined if `x` is not enumerable.\n find: func(x, fn) {\n if !is_enumerable(x) { return undefined }\n\n for k, v in x {\n if fn(k, v) { return v }\n }\n },\n // find_key iterates over elements of `x`, returning key or index of the first\n // element `fn` returns truthy for. `fn` is invoked with two arguments: `key`\n // and `value`. `key` is an int index if `x` is array. `key` is a string key if\n // `x` is map. It returns undefined if `x` is not enumerable.\n find_key: func(x, fn) {\n if !is_enumerable(x) { return undefined }\n\n for k, v in x {\n if fn(k, v) { return k }\n }\n },\n // map creates an array of values by running each element in `x` through `fn`.\n // `fn` is invoked with two arguments: `key` and `value`. `key` is an int index\n // if `x` is array. `key` is a string key if `x` is map. It returns undefined\n // if `x` is not enumerable.\n map: func(x, fn) {\n if !is_enumerable(x) { return undefined }\n\n dst := []\n for k, v in x {\n dst = append(dst, fn(k, v))\n }\n\n return dst\n },\n // key returns the first argument.\n key: func(k, _) { return k },\n // value returns the second argument.\n value: func(_, v) { return v }\n}\n",
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/srcmod_enum.tengo b/vendor/github.com/d5/tengo/stdlib/srcmod_enum.tengo
deleted file mode 100644
index 7a5ea637..00000000
--- a/vendor/github.com/d5/tengo/stdlib/srcmod_enum.tengo
+++ /dev/null
@@ -1,128 +0,0 @@
-is_enumerable := func(x) {
- return is_array(x) || is_map(x) || is_immutable_array(x) || is_immutable_map(x)
-}
-
-is_array_like := func(x) {
- return is_array(x) || is_immutable_array(x)
-}
-
-export {
- // all returns true if the given function `fn` evaluates to a truthy value on
- // all of the items in `x`. It returns undefined if `x` is not enumerable.
- all: func(x, fn) {
- if !is_enumerable(x) { return undefined }
-
- for k, v in x {
- if !fn(k, v) { return false }
- }
-
- return true
- },
- // any returns true if the given function `fn` evaluates to a truthy value on
- // any of the items in `x`. It returns undefined if `x` is not enumerable.
- any: func(x, fn) {
- if !is_enumerable(x) { return undefined }
-
- for k, v in x {
- if fn(k, v) { return true }
- }
-
- return false
- },
- // chunk returns an array of elements split into groups the length of size.
- // If `x` can't be split evenly, the final chunk will be the remaining elements.
- // It returns undefined if `x` is not array.
- chunk: func(x, size) {
- if !is_array_like(x) || !size { return undefined }
-
- numElements := len(x)
- if !numElements { return [] }
-
- res := []
- idx := 0
- for idx < numElements {
- res = append(res, x[idx:idx+size])
- idx += size
- }
-
- return res
- },
- // at returns an element at the given index (if `x` is array) or
- // key (if `x` is map). It returns undefined if `x` is not enumerable.
- at: func(x, key) {
- if !is_enumerable(x) { return undefined }
-
- if is_array_like(x) {
- if !is_int(key) { return undefined }
- } else {
- if !is_string(key) { return undefined }
- }
-
- return x[key]
- },
- // each iterates over elements of `x` and invokes `fn` for each element. `fn` is
- // invoked with two arguments: `key` and `value`. `key` is an int index
- // if `x` is array. `key` is a string key if `x` is map. It does not iterate
- // and returns undefined if `x` is not enumerable.
- each: func(x, fn) {
- if !is_enumerable(x) { return undefined }
-
- for k, v in x {
- fn(k, v)
- }
- },
- // filter iterates over elements of `x`, returning an array of all elements `fn`
- // returns truthy for. `fn` is invoked with two arguments: `key` and `value`.
- // `key` is an int index if `x` is array. `key` is a string key if `x` is map.
- // It returns undefined if `x` is not enumerable.
- filter: func(x, fn) {
- if !is_array_like(x) { return undefined }
-
- dst := []
- for k, v in x {
- if fn(k, v) { dst = append(dst, v) }
- }
-
- return dst
- },
- // find iterates over elements of `x`, returning value of the first element `fn`
- // returns truthy for. `fn` is invoked with two arguments: `key` and `value`.
- // `key` is an int index if `x` is array. `key` is a string key if `x` is map.
- // It returns undefined if `x` is not enumerable.
- find: func(x, fn) {
- if !is_enumerable(x) { return undefined }
-
- for k, v in x {
- if fn(k, v) { return v }
- }
- },
- // find_key iterates over elements of `x`, returning key or index of the first
- // element `fn` returns truthy for. `fn` is invoked with two arguments: `key`
- // and `value`. `key` is an int index if `x` is array. `key` is a string key if
- // `x` is map. It returns undefined if `x` is not enumerable.
- find_key: func(x, fn) {
- if !is_enumerable(x) { return undefined }
-
- for k, v in x {
- if fn(k, v) { return k }
- }
- },
- // map creates an array of values by running each element in `x` through `fn`.
- // `fn` is invoked with two arguments: `key` and `value`. `key` is an int index
- // if `x` is array. `key` is a string key if `x` is map. It returns undefined
- // if `x` is not enumerable.
- map: func(x, fn) {
- if !is_enumerable(x) { return undefined }
-
- dst := []
- for k, v in x {
- dst = append(dst, fn(k, v))
- }
-
- return dst
- },
- // key returns the first argument.
- key: func(k, _) { return k },
- // value returns the second argument.
- value: func(_, v) { return v }
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/stdlib.go b/vendor/github.com/d5/tengo/stdlib/stdlib.go
deleted file mode 100644
index aad220ee..00000000
--- a/vendor/github.com/d5/tengo/stdlib/stdlib.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package stdlib
-
-//go:generate go run gensrcmods.go
-
-import "github.com/d5/tengo/objects"
-
-// AllModuleNames returns a list of all default module names.
-func AllModuleNames() []string {
- var names []string
- for name := range BuiltinModules {
- names = append(names, name)
- }
- for name := range SourceModules {
- names = append(names, name)
- }
- return names
-}
-
-// GetModuleMap returns the module map that includes all modules
-// for the given module names.
-func GetModuleMap(names ...string) *objects.ModuleMap {
- modules := objects.NewModuleMap()
-
- for _, name := range names {
- if mod := BuiltinModules[name]; mod != nil {
- modules.AddBuiltinModule(name, mod)
- }
- if mod := SourceModules[name]; mod != "" {
- modules.AddSourceModule(name, []byte(mod))
- }
- }
-
- return modules
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/text.go b/vendor/github.com/d5/tengo/stdlib/text.go
deleted file mode 100644
index 4b5729ec..00000000
--- a/vendor/github.com/d5/tengo/stdlib/text.go
+++ /dev/null
@@ -1,930 +0,0 @@
-package stdlib
-
-import (
- "fmt"
- "regexp"
- "strconv"
- "strings"
- "unicode/utf8"
-
- "github.com/d5/tengo"
- "github.com/d5/tengo/objects"
-)
-
-var textModule = map[string]objects.Object{
- "re_match": &objects.UserFunction{Name: "re_match", Value: textREMatch}, // re_match(pattern, text) => bool/error
- "re_find": &objects.UserFunction{Name: "re_find", Value: textREFind}, // re_find(pattern, text, count) => [[{text:,begin:,end:}]]/undefined
- "re_replace": &objects.UserFunction{Name: "re_replace", Value: textREReplace}, // re_replace(pattern, text, repl) => string/error
- "re_split": &objects.UserFunction{Name: "re_split", Value: textRESplit}, // re_split(pattern, text, count) => [string]/error
- "re_compile": &objects.UserFunction{Name: "re_compile", Value: textRECompile}, // re_compile(pattern) => Regexp/error
- "compare": &objects.UserFunction{Name: "compare", Value: FuncASSRI(strings.Compare)}, // compare(a, b) => int
- "contains": &objects.UserFunction{Name: "contains", Value: FuncASSRB(strings.Contains)}, // contains(s, substr) => bool
- "contains_any": &objects.UserFunction{Name: "contains_any", Value: FuncASSRB(strings.ContainsAny)}, // contains_any(s, chars) => bool
- "count": &objects.UserFunction{Name: "count", Value: FuncASSRI(strings.Count)}, // count(s, substr) => int
- "equal_fold": &objects.UserFunction{Name: "equal_fold", Value: FuncASSRB(strings.EqualFold)}, // "equal_fold(s, t) => bool
- "fields": &objects.UserFunction{Name: "fields", Value: FuncASRSs(strings.Fields)}, // fields(s) => [string]
- "has_prefix": &objects.UserFunction{Name: "has_prefix", Value: FuncASSRB(strings.HasPrefix)}, // has_prefix(s, prefix) => bool
- "has_suffix": &objects.UserFunction{Name: "has_suffix", Value: FuncASSRB(strings.HasSuffix)}, // has_suffix(s, suffix) => bool
- "index": &objects.UserFunction{Name: "index", Value: FuncASSRI(strings.Index)}, // index(s, substr) => int
- "index_any": &objects.UserFunction{Name: "index_any", Value: FuncASSRI(strings.IndexAny)}, // index_any(s, chars) => int
- "join": &objects.UserFunction{Name: "join", Value: textJoin}, // join(arr, sep) => string
- "last_index": &objects.UserFunction{Name: "last_index", Value: FuncASSRI(strings.LastIndex)}, // last_index(s, substr) => int
- "last_index_any": &objects.UserFunction{Name: "last_index_any", Value: FuncASSRI(strings.LastIndexAny)}, // last_index_any(s, chars) => int
- "repeat": &objects.UserFunction{Name: "repeat", Value: textRepeat}, // repeat(s, count) => string
- "replace": &objects.UserFunction{Name: "replace", Value: textReplace}, // replace(s, old, new, n) => string
- "substr": &objects.UserFunction{Name: "substr", Value: textSubstring}, // substr(s, lower, upper) => string
- "split": &objects.UserFunction{Name: "split", Value: FuncASSRSs(strings.Split)}, // split(s, sep) => [string]
- "split_after": &objects.UserFunction{Name: "split_after", Value: FuncASSRSs(strings.SplitAfter)}, // split_after(s, sep) => [string]
- "split_after_n": &objects.UserFunction{Name: "split_after_n", Value: FuncASSIRSs(strings.SplitAfterN)}, // split_after_n(s, sep, n) => [string]
- "split_n": &objects.UserFunction{Name: "split_n", Value: FuncASSIRSs(strings.SplitN)}, // split_n(s, sep, n) => [string]
- "title": &objects.UserFunction{Name: "title", Value: FuncASRS(strings.Title)}, // title(s) => string
- "to_lower": &objects.UserFunction{Name: "to_lower", Value: FuncASRS(strings.ToLower)}, // to_lower(s) => string
- "to_title": &objects.UserFunction{Name: "to_title", Value: FuncASRS(strings.ToTitle)}, // to_title(s) => string
- "to_upper": &objects.UserFunction{Name: "to_upper", Value: FuncASRS(strings.ToUpper)}, // to_upper(s) => string
- "pad_left": &objects.UserFunction{Name: "pad_left", Value: textPadLeft}, // pad_left(s, pad_len, pad_with) => string
- "pad_right": &objects.UserFunction{Name: "pad_right", Value: textPadRight}, // pad_right(s, pad_len, pad_with) => string
- "trim": &objects.UserFunction{Name: "trim", Value: FuncASSRS(strings.Trim)}, // trim(s, cutset) => string
- "trim_left": &objects.UserFunction{Name: "trim_left", Value: FuncASSRS(strings.TrimLeft)}, // trim_left(s, cutset) => string
- "trim_prefix": &objects.UserFunction{Name: "trim_prefix", Value: FuncASSRS(strings.TrimPrefix)}, // trim_prefix(s, prefix) => string
- "trim_right": &objects.UserFunction{Name: "trim_right", Value: FuncASSRS(strings.TrimRight)}, // trim_right(s, cutset) => string
- "trim_space": &objects.UserFunction{Name: "trim_space", Value: FuncASRS(strings.TrimSpace)}, // trim_space(s) => string
- "trim_suffix": &objects.UserFunction{Name: "trim_suffix", Value: FuncASSRS(strings.TrimSuffix)}, // trim_suffix(s, suffix) => string
- "atoi": &objects.UserFunction{Name: "atoi", Value: FuncASRIE(strconv.Atoi)}, // atoi(str) => int/error
- "format_bool": &objects.UserFunction{Name: "format_bool", Value: textFormatBool}, // format_bool(b) => string
- "format_float": &objects.UserFunction{Name: "format_float", Value: textFormatFloat}, // format_float(f, fmt, prec, bits) => string
- "format_int": &objects.UserFunction{Name: "format_int", Value: textFormatInt}, // format_int(i, base) => string
- "itoa": &objects.UserFunction{Name: "itoa", Value: FuncAIRS(strconv.Itoa)}, // itoa(i) => string
- "parse_bool": &objects.UserFunction{Name: "parse_bool", Value: textParseBool}, // parse_bool(str) => bool/error
- "parse_float": &objects.UserFunction{Name: "parse_float", Value: textParseFloat}, // parse_float(str, bits) => float/error
- "parse_int": &objects.UserFunction{Name: "parse_int", Value: textParseInt}, // parse_int(str, base, bits) => int/error
- "quote": &objects.UserFunction{Name: "quote", Value: FuncASRS(strconv.Quote)}, // quote(str) => string
- "unquote": &objects.UserFunction{Name: "unquote", Value: FuncASRSE(strconv.Unquote)}, // unquote(str) => string/error
-}
-
-func textREMatch(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- matched, err := regexp.MatchString(s1, s2)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- if matched {
- ret = objects.TrueValue
- } else {
- ret = objects.FalseValue
- }
-
- return
-}
-
-func textREFind(args ...objects.Object) (ret objects.Object, err error) {
- numArgs := len(args)
- if numArgs != 2 && numArgs != 3 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- re, err := regexp.Compile(s1)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- if numArgs < 3 {
- m := re.FindStringSubmatchIndex(s2)
- if m == nil {
- ret = objects.UndefinedValue
- return
- }
-
- arr := &objects.Array{}
- for i := 0; i < len(m); i += 2 {
- arr.Value = append(arr.Value, &objects.ImmutableMap{Value: map[string]objects.Object{
- "text": &objects.String{Value: s2[m[i]:m[i+1]]},
- "begin": &objects.Int{Value: int64(m[i])},
- "end": &objects.Int{Value: int64(m[i+1])},
- }})
- }
-
- ret = &objects.Array{Value: []objects.Object{arr}}
-
- return
- }
-
- i3, ok := objects.ToInt(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
- m := re.FindAllStringSubmatchIndex(s2, i3)
- if m == nil {
- ret = objects.UndefinedValue
- return
- }
-
- arr := &objects.Array{}
- for _, m := range m {
- subMatch := &objects.Array{}
- for i := 0; i < len(m); i += 2 {
- subMatch.Value = append(subMatch.Value, &objects.ImmutableMap{Value: map[string]objects.Object{
- "text": &objects.String{Value: s2[m[i]:m[i+1]]},
- "begin": &objects.Int{Value: int64(m[i])},
- "end": &objects.Int{Value: int64(m[i+1])},
- }})
- }
-
- arr.Value = append(arr.Value, subMatch)
- }
-
- ret = arr
-
- return
-}
-
-func textREReplace(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 3 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- s3, ok := objects.ToString(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "string(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
-
- re, err := regexp.Compile(s1)
- if err != nil {
- ret = wrapError(err)
- } else {
- s, ok := doTextRegexpReplace(re, s2, s3)
- if !ok {
- return nil, objects.ErrStringLimit
- }
-
- ret = &objects.String{Value: s}
- }
-
- return
-}
-
-func textRESplit(args ...objects.Object) (ret objects.Object, err error) {
- numArgs := len(args)
- if numArgs != 2 && numArgs != 3 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- var i3 = -1
- if numArgs > 2 {
- i3, ok = objects.ToInt(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
- }
-
- re, err := regexp.Compile(s1)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- arr := &objects.Array{}
- for _, s := range re.Split(s2, i3) {
- arr.Value = append(arr.Value, &objects.String{Value: s})
- }
-
- ret = arr
-
- return
-}
-
-func textRECompile(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- re, err := regexp.Compile(s1)
- if err != nil {
- ret = wrapError(err)
- } else {
- ret = makeTextRegexp(re)
- }
-
- return
-}
-
-func textReplace(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 4 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- s3, ok := objects.ToString(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "string(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
-
- i4, ok := objects.ToInt(args[3])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "fourth",
- Expected: "int(compatible)",
- Found: args[3].TypeName(),
- }
- return
- }
-
- s, ok := doTextReplace(s1, s2, s3, i4)
- if !ok {
- err = objects.ErrStringLimit
- return
- }
-
- ret = &objects.String{Value: s}
-
- return
-}
-
-func textSubstring(args ...objects.Object) (ret objects.Object, err error) {
- argslen := len(args)
- if argslen != 2 && argslen != 3 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- strlen := len(s1)
- i3 := strlen
- if argslen == 3 {
- i3, ok = objects.ToInt(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
- }
-
- if i2 > i3 {
- err = objects.ErrInvalidIndexType
- return
- }
-
- if i2 < 0 {
- i2 = 0
- } else if i2 > strlen {
- i2 = strlen
- }
-
- if i3 < 0 {
- i3 = 0
- } else if i3 > strlen {
- i3 = strlen
- }
-
- ret = &objects.String{Value: s1[i2:i3]}
-
- return
-}
-
-func textPadLeft(args ...objects.Object) (ret objects.Object, err error) {
- argslen := len(args)
- if argslen != 2 && argslen != 3 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- if i2 > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- sLen := len(s1)
- if sLen >= i2 {
- ret = &objects.String{Value: s1}
- return
- }
-
- s3 := " "
- if argslen == 3 {
- s3, ok = objects.ToString(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "string(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
- }
-
- padStrLen := len(s3)
- if padStrLen == 0 {
- ret = &objects.String{Value: s1}
- return
- }
-
- padCount := ((i2 - padStrLen) / padStrLen) + 1
- retStr := strings.Repeat(s3, int(padCount)) + s1
- ret = &objects.String{Value: retStr[len(retStr)-i2:]}
-
- return
-}
-
-func textPadRight(args ...objects.Object) (ret objects.Object, err error) {
- argslen := len(args)
- if argslen != 2 && argslen != 3 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- if i2 > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- sLen := len(s1)
- if sLen >= i2 {
- ret = &objects.String{Value: s1}
- return
- }
-
- s3 := " "
- if argslen == 3 {
- s3, ok = objects.ToString(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "string(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
- }
-
- padStrLen := len(s3)
- if padStrLen == 0 {
- ret = &objects.String{Value: s1}
- return
- }
-
- padCount := ((i2 - padStrLen) / padStrLen) + 1
- retStr := s1 + strings.Repeat(s3, int(padCount))
- ret = &objects.String{Value: retStr[:i2]}
-
- return
-}
-
-func textRepeat(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- if len(s1)*i2 > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: strings.Repeat(s1, i2)}, nil
-}
-
-func textJoin(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- return nil, objects.ErrWrongNumArguments
- }
-
- var slen int
- var ss1 []string
- switch arg0 := args[0].(type) {
- case *objects.Array:
- for idx, a := range arg0.Value {
- as, ok := objects.ToString(a)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: fmt.Sprintf("first[%d]", idx),
- Expected: "string(compatible)",
- Found: a.TypeName(),
- }
- }
- slen += len(as)
- ss1 = append(ss1, as)
- }
- case *objects.ImmutableArray:
- for idx, a := range arg0.Value {
- as, ok := objects.ToString(a)
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: fmt.Sprintf("first[%d]", idx),
- Expected: "string(compatible)",
- Found: a.TypeName(),
- }
- }
- slen += len(as)
- ss1 = append(ss1, as)
- }
- default:
- return nil, objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "array",
- Found: args[0].TypeName(),
- }
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- return nil, objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- }
-
- // make sure output length does not exceed the limit
- if slen+len(s2)*(len(ss1)-1) > tengo.MaxStringLen {
- return nil, objects.ErrStringLimit
- }
-
- return &objects.String{Value: strings.Join(ss1, s2)}, nil
-}
-
-func textFormatBool(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- b1, ok := args[0].(*objects.Bool)
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "bool",
- Found: args[0].TypeName(),
- }
- return
- }
-
- if b1 == objects.TrueValue {
- ret = &objects.String{Value: "true"}
- } else {
- ret = &objects.String{Value: "false"}
- }
-
- return
-}
-
-func textFormatFloat(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 4 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- f1, ok := args[0].(*objects.Float)
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "float",
- Found: args[0].TypeName(),
- }
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- i3, ok := objects.ToInt(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
-
- i4, ok := objects.ToInt(args[3])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "fourth",
- Expected: "int(compatible)",
- Found: args[3].TypeName(),
- }
- return
- }
-
- ret = &objects.String{Value: strconv.FormatFloat(f1.Value, s2[0], i3, i4)}
-
- return
-}
-
-func textFormatInt(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := args[0].(*objects.Int)
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- ret = &objects.String{Value: strconv.FormatInt(i1.Value, i2)}
-
- return
-}
-
-func textParseBool(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := args[0].(*objects.String)
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string",
- Found: args[0].TypeName(),
- }
- return
- }
-
- parsed, err := strconv.ParseBool(s1.Value)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- if parsed {
- ret = objects.TrueValue
- } else {
- ret = objects.FalseValue
- }
-
- return
-}
-
-func textParseFloat(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := args[0].(*objects.String)
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- parsed, err := strconv.ParseFloat(s1.Value, i2)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- ret = &objects.Float{Value: parsed}
-
- return
-}
-
-func textParseInt(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 3 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := args[0].(*objects.String)
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- i3, ok := objects.ToInt(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
-
- parsed, err := strconv.ParseInt(s1.Value, i2, i3)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- ret = &objects.Int{Value: parsed}
-
- return
-}
-
-// Modified implementation of strings.Replace
-// to limit the maximum length of output string.
-func doTextReplace(s, old, new string, n int) (string, bool) {
- if old == new || n == 0 {
- return s, true // avoid allocation
- }
-
- // Compute number of replacements.
- if m := strings.Count(s, old); m == 0 {
- return s, true // avoid allocation
- } else if n < 0 || m < n {
- n = m
- }
-
- // Apply replacements to buffer.
- t := make([]byte, len(s)+n*(len(new)-len(old)))
- w := 0
- start := 0
- for i := 0; i < n; i++ {
- j := start
- if len(old) == 0 {
- if i > 0 {
- _, wid := utf8.DecodeRuneInString(s[start:])
- j += wid
- }
- } else {
- j += strings.Index(s[start:], old)
- }
-
- ssj := s[start:j]
- if w+len(ssj)+len(new) > tengo.MaxStringLen {
- return "", false
- }
-
- w += copy(t[w:], ssj)
- w += copy(t[w:], new)
- start = j + len(old)
- }
-
- ss := s[start:]
- if w+len(ss) > tengo.MaxStringLen {
- return "", false
- }
-
- w += copy(t[w:], ss)
-
- return string(t[0:w]), true
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/text_regexp.go b/vendor/github.com/d5/tengo/stdlib/text_regexp.go
deleted file mode 100644
index 16f135bf..00000000
--- a/vendor/github.com/d5/tengo/stdlib/text_regexp.go
+++ /dev/null
@@ -1,228 +0,0 @@
-package stdlib
-
-import (
- "regexp"
-
- "github.com/d5/tengo"
- "github.com/d5/tengo/objects"
-)
-
-func makeTextRegexp(re *regexp.Regexp) *objects.ImmutableMap {
- return &objects.ImmutableMap{
- Value: map[string]objects.Object{
- // match(text) => bool
- "match": &objects.UserFunction{
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- if re.MatchString(s1) {
- ret = objects.TrueValue
- } else {
- ret = objects.FalseValue
- }
-
- return
- },
- },
-
- // find(text) => array(array({text:,begin:,end:}))/undefined
- // find(text, maxCount) => array(array({text:,begin:,end:}))/undefined
- "find": &objects.UserFunction{
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- numArgs := len(args)
- if numArgs != 1 && numArgs != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- if numArgs == 1 {
- m := re.FindStringSubmatchIndex(s1)
- if m == nil {
- ret = objects.UndefinedValue
- return
- }
-
- arr := &objects.Array{}
- for i := 0; i < len(m); i += 2 {
- arr.Value = append(arr.Value, &objects.ImmutableMap{Value: map[string]objects.Object{
- "text": &objects.String{Value: s1[m[i]:m[i+1]]},
- "begin": &objects.Int{Value: int64(m[i])},
- "end": &objects.Int{Value: int64(m[i+1])},
- }})
- }
-
- ret = &objects.Array{Value: []objects.Object{arr}}
-
- return
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
- m := re.FindAllStringSubmatchIndex(s1, i2)
- if m == nil {
- ret = objects.UndefinedValue
- return
- }
-
- arr := &objects.Array{}
- for _, m := range m {
- subMatch := &objects.Array{}
- for i := 0; i < len(m); i += 2 {
- subMatch.Value = append(subMatch.Value, &objects.ImmutableMap{Value: map[string]objects.Object{
- "text": &objects.String{Value: s1[m[i]:m[i+1]]},
- "begin": &objects.Int{Value: int64(m[i])},
- "end": &objects.Int{Value: int64(m[i+1])},
- }})
- }
-
- arr.Value = append(arr.Value, subMatch)
- }
-
- ret = arr
-
- return
- },
- },
-
- // replace(src, repl) => string
- "replace": &objects.UserFunction{
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- s, ok := doTextRegexpReplace(re, s1, s2)
- if !ok {
- return nil, objects.ErrStringLimit
- }
-
- ret = &objects.String{Value: s}
-
- return
- },
- },
-
- // split(text) => array(string)
- // split(text, maxCount) => array(string)
- "split": &objects.UserFunction{
- Value: func(args ...objects.Object) (ret objects.Object, err error) {
- numArgs := len(args)
- if numArgs != 1 && numArgs != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- var i2 = -1
- if numArgs > 1 {
- i2, ok = objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
- }
-
- arr := &objects.Array{}
- for _, s := range re.Split(s1, i2) {
- arr.Value = append(arr.Value, &objects.String{Value: s})
- }
-
- ret = arr
-
- return
- },
- },
- },
- }
-}
-
-// Size-limit checking implementation of regexp.ReplaceAllString.
-func doTextRegexpReplace(re *regexp.Regexp, src, repl string) (string, bool) {
- idx := 0
- out := ""
-
- for _, m := range re.FindAllStringSubmatchIndex(src, -1) {
- var exp []byte
- exp = re.ExpandString(exp, repl, src, m)
-
- if len(out)+m[0]-idx+len(exp) > tengo.MaxStringLen {
- return "", false
- }
-
- out += src[idx:m[0]] + string(exp)
- idx = m[1]
- }
- if idx < len(src) {
- if len(out)+len(src)-idx > tengo.MaxStringLen {
- return "", false
- }
-
- out += src[idx:]
- }
-
- return string(out), true
-}
diff --git a/vendor/github.com/d5/tengo/stdlib/times.go b/vendor/github.com/d5/tengo/stdlib/times.go
deleted file mode 100644
index 111c877a..00000000
--- a/vendor/github.com/d5/tengo/stdlib/times.go
+++ /dev/null
@@ -1,989 +0,0 @@
-package stdlib
-
-import (
- "time"
-
- "github.com/d5/tengo"
- "github.com/d5/tengo/objects"
-)
-
-var timesModule = map[string]objects.Object{
- "format_ansic": &objects.String{Value: time.ANSIC},
- "format_unix_date": &objects.String{Value: time.UnixDate},
- "format_ruby_date": &objects.String{Value: time.RubyDate},
- "format_rfc822": &objects.String{Value: time.RFC822},
- "format_rfc822z": &objects.String{Value: time.RFC822Z},
- "format_rfc850": &objects.String{Value: time.RFC850},
- "format_rfc1123": &objects.String{Value: time.RFC1123},
- "format_rfc1123z": &objects.String{Value: time.RFC1123Z},
- "format_rfc3339": &objects.String{Value: time.RFC3339},
- "format_rfc3339_nano": &objects.String{Value: time.RFC3339Nano},
- "format_kitchen": &objects.String{Value: time.Kitchen},
- "format_stamp": &objects.String{Value: time.Stamp},
- "format_stamp_milli": &objects.String{Value: time.StampMilli},
- "format_stamp_micro": &objects.String{Value: time.StampMicro},
- "format_stamp_nano": &objects.String{Value: time.StampNano},
- "nanosecond": &objects.Int{Value: int64(time.Nanosecond)},
- "microsecond": &objects.Int{Value: int64(time.Microsecond)},
- "millisecond": &objects.Int{Value: int64(time.Millisecond)},
- "second": &objects.Int{Value: int64(time.Second)},
- "minute": &objects.Int{Value: int64(time.Minute)},
- "hour": &objects.Int{Value: int64(time.Hour)},
- "january": &objects.Int{Value: int64(time.January)},
- "february": &objects.Int{Value: int64(time.February)},
- "march": &objects.Int{Value: int64(time.March)},
- "april": &objects.Int{Value: int64(time.April)},
- "may": &objects.Int{Value: int64(time.May)},
- "june": &objects.Int{Value: int64(time.June)},
- "july": &objects.Int{Value: int64(time.July)},
- "august": &objects.Int{Value: int64(time.August)},
- "september": &objects.Int{Value: int64(time.September)},
- "october": &objects.Int{Value: int64(time.October)},
- "november": &objects.Int{Value: int64(time.November)},
- "december": &objects.Int{Value: int64(time.December)},
- "sleep": &objects.UserFunction{Name: "sleep", Value: timesSleep}, // sleep(int)
- "parse_duration": &objects.UserFunction{Name: "parse_duration", Value: timesParseDuration}, // parse_duration(str) => int
- "since": &objects.UserFunction{Name: "since", Value: timesSince}, // since(time) => int
- "until": &objects.UserFunction{Name: "until", Value: timesUntil}, // until(time) => int
- "duration_hours": &objects.UserFunction{Name: "duration_hours", Value: timesDurationHours}, // duration_hours(int) => float
- "duration_minutes": &objects.UserFunction{Name: "duration_minutes", Value: timesDurationMinutes}, // duration_minutes(int) => float
- "duration_nanoseconds": &objects.UserFunction{Name: "duration_nanoseconds", Value: timesDurationNanoseconds}, // duration_nanoseconds(int) => int
- "duration_seconds": &objects.UserFunction{Name: "duration_seconds", Value: timesDurationSeconds}, // duration_seconds(int) => float
- "duration_string": &objects.UserFunction{Name: "duration_string", Value: timesDurationString}, // duration_string(int) => string
- "month_string": &objects.UserFunction{Name: "month_string", Value: timesMonthString}, // month_string(int) => string
- "date": &objects.UserFunction{Name: "date", Value: timesDate}, // date(year, month, day, hour, min, sec, nsec) => time
- "now": &objects.UserFunction{Name: "now", Value: timesNow}, // now() => time
- "parse": &objects.UserFunction{Name: "parse", Value: timesParse}, // parse(format, str) => time
- "unix": &objects.UserFunction{Name: "unix", Value: timesUnix}, // unix(sec, nsec) => time
- "add": &objects.UserFunction{Name: "add", Value: timesAdd}, // add(time, int) => time
- "add_date": &objects.UserFunction{Name: "add_date", Value: timesAddDate}, // add_date(time, years, months, days) => time
- "sub": &objects.UserFunction{Name: "sub", Value: timesSub}, // sub(t time, u time) => int
- "after": &objects.UserFunction{Name: "after", Value: timesAfter}, // after(t time, u time) => bool
- "before": &objects.UserFunction{Name: "before", Value: timesBefore}, // before(t time, u time) => bool
- "time_year": &objects.UserFunction{Name: "time_year", Value: timesTimeYear}, // time_year(time) => int
- "time_month": &objects.UserFunction{Name: "time_month", Value: timesTimeMonth}, // time_month(time) => int
- "time_day": &objects.UserFunction{Name: "time_day", Value: timesTimeDay}, // time_day(time) => int
- "time_weekday": &objects.UserFunction{Name: "time_weekday", Value: timesTimeWeekday}, // time_weekday(time) => int
- "time_hour": &objects.UserFunction{Name: "time_hour", Value: timesTimeHour}, // time_hour(time) => int
- "time_minute": &objects.UserFunction{Name: "time_minute", Value: timesTimeMinute}, // time_minute(time) => int
- "time_second": &objects.UserFunction{Name: "time_second", Value: timesTimeSecond}, // time_second(time) => int
- "time_nanosecond": &objects.UserFunction{Name: "time_nanosecond", Value: timesTimeNanosecond}, // time_nanosecond(time) => int
- "time_unix": &objects.UserFunction{Name: "time_unix", Value: timesTimeUnix}, // time_unix(time) => int
- "time_unix_nano": &objects.UserFunction{Name: "time_unix_nano", Value: timesTimeUnixNano}, // time_unix_nano(time) => int
- "time_format": &objects.UserFunction{Name: "time_format", Value: timesTimeFormat}, // time_format(time, format) => string
- "time_location": &objects.UserFunction{Name: "time_location", Value: timesTimeLocation}, // time_location(time) => string
- "time_string": &objects.UserFunction{Name: "time_string", Value: timesTimeString}, // time_string(time) => string
- "is_zero": &objects.UserFunction{Name: "is_zero", Value: timesIsZero}, // is_zero(time) => bool
- "to_local": &objects.UserFunction{Name: "to_local", Value: timesToLocal}, // to_local(time) => time
- "to_utc": &objects.UserFunction{Name: "to_utc", Value: timesToUTC}, // to_utc(time) => time
-}
-
-func timesSleep(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- time.Sleep(time.Duration(i1))
- ret = objects.UndefinedValue
-
- return
-}
-
-func timesParseDuration(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- dur, err := time.ParseDuration(s1)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- ret = &objects.Int{Value: int64(dur)}
-
- return
-}
-
-func timesSince(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(time.Since(t1))}
-
- return
-}
-
-func timesUntil(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(time.Until(t1))}
-
- return
-}
-
-func timesDurationHours(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Float{Value: time.Duration(i1).Hours()}
-
- return
-}
-
-func timesDurationMinutes(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Float{Value: time.Duration(i1).Minutes()}
-
- return
-}
-
-func timesDurationNanoseconds(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: time.Duration(i1).Nanoseconds()}
-
- return
-}
-
-func timesDurationSeconds(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Float{Value: time.Duration(i1).Seconds()}
-
- return
-}
-
-func timesDurationString(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.String{Value: time.Duration(i1).String()}
-
- return
-}
-
-func timesMonthString(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.String{Value: time.Month(i1).String()}
-
- return
-}
-
-func timesDate(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 7 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
- i3, ok := objects.ToInt(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
- i4, ok := objects.ToInt(args[3])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "fourth",
- Expected: "int(compatible)",
- Found: args[3].TypeName(),
- }
- return
- }
- i5, ok := objects.ToInt(args[4])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "fifth",
- Expected: "int(compatible)",
- Found: args[4].TypeName(),
- }
- return
- }
- i6, ok := objects.ToInt(args[5])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "sixth",
- Expected: "int(compatible)",
- Found: args[5].TypeName(),
- }
- return
- }
- i7, ok := objects.ToInt(args[6])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "seventh",
- Expected: "int(compatible)",
- Found: args[6].TypeName(),
- }
- return
- }
-
- ret = &objects.Time{Value: time.Date(i1, time.Month(i2), i3, i4, i5, i6, i7, time.Now().Location())}
-
- return
-}
-
-func timesNow(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 0 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- ret = &objects.Time{Value: time.Now()}
-
- return
-}
-
-func timesParse(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- s1, ok := objects.ToString(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "string(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- parsed, err := time.Parse(s1, s2)
- if err != nil {
- ret = wrapError(err)
- return
- }
-
- ret = &objects.Time{Value: parsed}
-
- return
-}
-
-func timesUnix(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- i1, ok := objects.ToInt64(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "int(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt64(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- ret = &objects.Time{Value: time.Unix(i1, i2)}
-
- return
-}
-
-func timesAdd(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt64(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- ret = &objects.Time{Value: t1.Add(time.Duration(i2))}
-
- return
-}
-
-func timesSub(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- t2, ok := objects.ToTime(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "time(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Sub(t2))}
-
- return
-}
-
-func timesAddDate(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 4 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- i2, ok := objects.ToInt(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "int(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- i3, ok := objects.ToInt(args[2])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "third",
- Expected: "int(compatible)",
- Found: args[2].TypeName(),
- }
- return
- }
-
- i4, ok := objects.ToInt(args[3])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "fourth",
- Expected: "int(compatible)",
- Found: args[3].TypeName(),
- }
- return
- }
-
- ret = &objects.Time{Value: t1.AddDate(i2, i3, i4)}
-
- return
-}
-
-func timesAfter(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- t2, ok := objects.ToTime(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "time(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- if t1.After(t2) {
- ret = objects.TrueValue
- } else {
- ret = objects.FalseValue
- }
-
- return
-}
-
-func timesBefore(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- t2, ok := objects.ToTime(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- if t1.Before(t2) {
- ret = objects.TrueValue
- } else {
- ret = objects.FalseValue
- }
-
- return
-}
-
-func timesTimeYear(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Year())}
-
- return
-}
-
-func timesTimeMonth(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Month())}
-
- return
-}
-
-func timesTimeDay(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Day())}
-
- return
-}
-
-func timesTimeWeekday(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Weekday())}
-
- return
-}
-
-func timesTimeHour(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Hour())}
-
- return
-}
-
-func timesTimeMinute(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Minute())}
-
- return
-}
-
-func timesTimeSecond(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Second())}
-
- return
-}
-
-func timesTimeNanosecond(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Nanosecond())}
-
- return
-}
-
-func timesTimeUnix(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.Unix())}
-
- return
-}
-
-func timesTimeUnixNano(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Int{Value: int64(t1.UnixNano())}
-
- return
-}
-
-func timesTimeFormat(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 2 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- s2, ok := objects.ToString(args[1])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "second",
- Expected: "string(compatible)",
- Found: args[1].TypeName(),
- }
- return
- }
-
- s := t1.Format(s2)
- if len(s) > tengo.MaxStringLen {
-
- return nil, objects.ErrStringLimit
- }
-
- ret = &objects.String{Value: s}
-
- return
-}
-
-func timesIsZero(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- if t1.IsZero() {
- ret = objects.TrueValue
- } else {
- ret = objects.FalseValue
- }
-
- return
-}
-
-func timesToLocal(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Time{Value: t1.Local()}
-
- return
-}
-
-func timesToUTC(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.Time{Value: t1.UTC()}
-
- return
-}
-
-func timesTimeLocation(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.String{Value: t1.Location().String()}
-
- return
-}
-
-func timesTimeString(args ...objects.Object) (ret objects.Object, err error) {
- if len(args) != 1 {
- err = objects.ErrWrongNumArguments
- return
- }
-
- t1, ok := objects.ToTime(args[0])
- if !ok {
- err = objects.ErrInvalidArgumentType{
- Name: "first",
- Expected: "time(compatible)",
- Found: args[0].TypeName(),
- }
- return
- }
-
- ret = &objects.String{Value: t1.String()}
-
- return
-}