Moved interfaceToObject from scripts/conversion.go to objects/conversion.go as FromInterface

This commit is contained in:
Mike Bazuin 2019-01-21 17:04:27 +01:00
parent a32ef0a3c6
commit d8c83b6578
4 changed files with 58 additions and 59 deletions

View file

@ -1,6 +1,7 @@
package objects
import (
"fmt"
"strconv"
)
@ -138,3 +139,58 @@ func ToByteSlice(o Object) (v []byte, ok bool) {
//ok = false
return
}
// FromInterface will attempt to convert an interface{} v to a Tengo Object
func FromInterface(v interface{}) (Object, error) {
switch v := v.(type) {
case nil:
return &Undefined{}, nil
case string:
return &String{Value: v}, nil
case int64:
return &Int{Value: v}, nil
case int:
return &Int{Value: int64(v)}, nil
case bool:
return &Bool{Value: v}, nil
case rune:
return &Char{Value: v}, nil
case byte:
return &Char{Value: rune(v)}, nil
case float64:
return &Float{Value: v}, nil
case []byte:
return &Bytes{Value: v}, nil
case error:
return &Error{Value: &String{Value: v.Error()}}, nil
case map[string]Object:
return &Map{Value: v}, nil
case map[string]interface{}:
kv := make(map[string]Object)
for vk, vv := range v {
vo, err := FromInterface(vv)
if err != nil {
return nil, err
}
kv[vk] = vo
}
return &Map{Value: kv}, nil
case []Object:
return &Array{Value: v}, nil
case []interface{}:
arr := make([]Object, len(v), len(v))
for i, e := range v {
vo, err := FromInterface(e)
if err != nil {
return nil, err
}
arr[i] = vo
}
return &Array{Value: arr}, nil
case Object:
return v, nil
}
return nil, fmt.Errorf("unsupported value type: %T", v)
}

View file

@ -1,8 +1,6 @@
package script
import (
"fmt"
"github.com/d5/tengo/objects"
)
@ -30,58 +28,3 @@ func objectToInterface(o objects.Object) interface{} {
return o
}
func interfaceToObject(v interface{}) (objects.Object, error) {
switch v := v.(type) {
case nil:
return undefined, nil
case string:
return &objects.String{Value: v}, nil
case int64:
return &objects.Int{Value: v}, nil
case int:
return &objects.Int{Value: int64(v)}, nil
case bool:
return &objects.Bool{Value: v}, nil
case rune:
return &objects.Char{Value: v}, nil
case byte:
return &objects.Char{Value: rune(v)}, nil
case float64:
return &objects.Float{Value: v}, nil
case []byte:
return &objects.Bytes{Value: v}, nil
case error:
return &objects.Error{Value: &objects.String{Value: v.Error()}}, nil
case map[string]objects.Object:
return &objects.Map{Value: v}, nil
case map[string]interface{}:
kv := make(map[string]objects.Object)
for vk, vv := range v {
vo, err := interfaceToObject(vv)
if err != nil {
return nil, err
}
kv[vk] = vo
}
return &objects.Map{Value: kv}, nil
case []objects.Object:
return &objects.Array{Value: v}, nil
case []interface{}:
arr := make([]objects.Object, len(v), len(v))
for _, e := range v {
vo, err := interfaceToObject(e)
if err != nil {
return nil, err
}
arr = append(arr, vo)
}
return &objects.Array{Value: arr}, nil
case objects.Object:
return v, nil
}
return nil, fmt.Errorf("unsupported value type: %T", v)
}

View file

@ -27,7 +27,7 @@ func New(input []byte) *Script {
// Add adds a new variable or updates an existing variable to the script.
func (s *Script) Add(name string, value interface{}) error {
obj, err := interfaceToObject(value)
obj, err := objects.FromInterface(value)
if err != nil {
return err
}

View file

@ -14,7 +14,7 @@ type Variable struct {
// NewVariable creates a Variable.
func NewVariable(name string, value interface{}) (*Variable, error) {
obj, err := interfaceToObject(value)
obj, err := objects.FromInterface(value)
if err != nil {
return nil, err
}