smartcontract: provide NewParametersFromValues for convenience as well

This commit is contained in:
Roman Khimov 2022-07-29 12:38:33 +03:00
parent 92a931c145
commit 55164132df
2 changed files with 34 additions and 7 deletions

View file

@ -333,14 +333,10 @@ func NewParameterFromValue(value interface{}) (Parameter, error) {
result.Type = ArrayType
result.Value = arr
case []interface{}:
arr := make([]Parameter, 0, len(v))
for i := range v {
elem, err := NewParameterFromValue(v[i])
arr, err := NewParametersFromValues(v...)
if err != nil {
return result, err
}
arr = append(arr, elem)
}
result.Type = ArrayType
result.Value = arr
default:
@ -350,6 +346,20 @@ func NewParameterFromValue(value interface{}) (Parameter, error) {
return result, nil
}
// NewParametersFromValues is similar to NewParameterFromValue except that it
// works with multiple values and returns a simple slice of Parameter.
func NewParametersFromValues(values ...interface{}) ([]Parameter, error) {
res := make([]Parameter, 0, len(values))
for i := range values {
elem, err := NewParameterFromValue(values[i])
if err != nil {
return nil, err
}
res = append(res, elem)
}
return res, nil
}
// ExpandParameterToEmitable converts a parameter to a type which can be handled as
// an array item by emit.Array. It correlates with the way an RPC server handles
// FuncParams for invoke* calls inside the request.ExpandArrayIntoScript function.

View file

@ -692,3 +692,20 @@ func TestParameterFromValue(t *testing.T) {
_, err = NewParameterFromValue([]interface{}{1, 2, make(map[string]int)})
require.Error(t, err)
}
func TestParametersFromValues(t *testing.T) {
res, err := NewParametersFromValues(42, "some", []byte{3, 2, 1})
require.NoError(t, err)
require.Equal(t, []Parameter{{
Type: IntegerType,
Value: big.NewInt(42),
}, {
Type: StringType,
Value: "some",
}, {
Type: ByteArrayType,
Value: []byte{3, 2, 1},
}}, res)
_, err = NewParametersFromValues(42, make(map[int]int), []byte{3, 2, 1})
require.Error(t, err)
}