summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/d5/tengo/v2/stdlib/fmt.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/d5/tengo/v2/stdlib/fmt.go')
-rw-r--r--vendor/github.com/d5/tengo/v2/stdlib/fmt.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/vendor/github.com/d5/tengo/v2/stdlib/fmt.go b/vendor/github.com/d5/tengo/v2/stdlib/fmt.go
new file mode 100644
index 00000000..9945277f
--- /dev/null
+++ b/vendor/github.com/d5/tengo/v2/stdlib/fmt.go
@@ -0,0 +1,101 @@
+package stdlib
+
+import (
+ "fmt"
+
+ "github.com/d5/tengo/v2"
+)
+
+var fmtModule = map[string]tengo.Object{
+ "print": &tengo.UserFunction{Name: "print", Value: fmtPrint},
+ "printf": &tengo.UserFunction{Name: "printf", Value: fmtPrintf},
+ "println": &tengo.UserFunction{Name: "println", Value: fmtPrintln},
+ "sprintf": &tengo.UserFunction{Name: "sprintf", Value: fmtSprintf},
+}
+
+func fmtPrint(args ...tengo.Object) (ret tengo.Object, err error) {
+ printArgs, err := getPrintArgs(args...)
+ if err != nil {
+ return nil, err
+ }
+ _, _ = fmt.Print(printArgs...)
+ return nil, nil
+}
+
+func fmtPrintf(args ...tengo.Object) (ret tengo.Object, err error) {
+ numArgs := len(args)
+ if numArgs == 0 {
+ return nil, tengo.ErrWrongNumArguments
+ }
+
+ format, ok := args[0].(*tengo.String)
+ if !ok {
+ return nil, tengo.ErrInvalidArgumentType{
+ Name: "format",
+ Expected: "string",
+ Found: args[0].TypeName(),
+ }
+ }
+ if numArgs == 1 {
+ fmt.Print(format)
+ return nil, nil
+ }
+
+ s, err := tengo.Format(format.Value, args[1:]...)
+ if err != nil {
+ return nil, err
+ }
+ fmt.Print(s)
+ return nil, nil
+}
+
+func fmtPrintln(args ...tengo.Object) (ret tengo.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 ...tengo.Object) (ret tengo.Object, err error) {
+ numArgs := len(args)
+ if numArgs == 0 {
+ return nil, tengo.ErrWrongNumArguments
+ }
+
+ format, ok := args[0].(*tengo.String)
+ if !ok {
+ return nil, tengo.ErrInvalidArgumentType{
+ Name: "format",
+ Expected: "string",
+ Found: args[0].TypeName(),
+ }
+ }
+ if numArgs == 1 {
+ // okay to return 'format' directly as String is immutable
+ return format, nil
+ }
+ s, err := tengo.Format(format.Value, args[1:]...)
+ if err != nil {
+ return nil, err
+ }
+ return &tengo.String{Value: s}, nil
+}
+
+func getPrintArgs(args ...tengo.Object) ([]interface{}, error) {
+ var printArgs []interface{}
+ l := 0
+ for _, arg := range args {
+ s, _ := tengo.ToString(arg)
+ slen := len(s)
+ // make sure length does not exceed the limit
+ if l+slen > tengo.MaxStringLen {
+ return nil, tengo.ErrStringLimit
+ }
+ l += slen
+ printArgs = append(printArgs, s)
+ }
+ return printArgs, nil
+}