diff --git a/fixtures/value.lua b/fixtures/value.lua new file mode 100644 index 0000000..cb9e7e8 --- /dev/null +++ b/fixtures/value.lua @@ -0,0 +1,6 @@ +local api = require("test") + +function main(input) + -- toNumbers accepts Value type + return api.toNumbers(input) +end \ No newline at end of file diff --git a/module_test.go b/module_test.go index 3cfd886..c708c52 100644 --- a/module_test.go +++ b/module_test.go @@ -30,9 +30,19 @@ func testModule() Module { must(m.Register("enrich", enrich)) must(m.Register("error", errorfunc)) must(m.Register("error1", errorfunc1)) + must(m.Register("toNumbers", toNumbers)) return m } +func toNumbers(v Value) (Numbers, error) { + switch t := v.(type) { + case Numbers: + return t, nil + default: + return nil, fmt.Errorf("unsupported type %T", v) + } +} + func sum(a, b Number) (Number, error) { return a + b, nil } @@ -99,6 +109,16 @@ func Test_Hash(t *testing.T) { assert.Equal(t, int64(4282878506), int64(out.(Number))) } +func Test_Value(t *testing.T) { + s, err := newScript("fixtures/value.lua") + assert.NoError(t, err) + + out, err := s.Run(context.Background(), []float64{1.1, 2.1}) + assert.NoError(t, err) + assert.Equal(t, TypeNumbers, out.Type()) + assert.Equal(t, []float64{1.1, 2.1}, out.Native()) +} + func Test_Sum(t *testing.T) { s, err := newScript("fixtures/sum.lua") assert.NoError(t, err) diff --git a/value.go b/value.go index 9de1fc9..41fad97 100644 --- a/value.go +++ b/value.go @@ -25,6 +25,7 @@ var ( typeBools = reflect.TypeOf(Bools(nil)) typeTable = reflect.TypeOf(Table(nil)) typeArray = reflect.TypeOf(Array(nil)) + typeValue = reflect.TypeOf((*Value)(nil)).Elem() ) var typeMap = map[reflect.Type]Type{ @@ -36,6 +37,7 @@ var typeMap = map[reflect.Type]Type{ typeBools: TypeBools, typeTable: TypeTable, typeArray: TypeArray, + typeValue: TypeValue, } // Type represents a type of the value @@ -52,6 +54,7 @@ const ( TypeStrings TypeTable TypeArray + TypeValue ) // Value represents a returned