123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 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
- }
|