manifest: move Parameter into a file of its own
This commit is contained in:
parent
0b2e9312af
commit
f3c761e4c2
4 changed files with 94 additions and 75 deletions
|
@ -7,12 +7,6 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Parameter represents smartcontract's parameter's definition.
|
|
||||||
type Parameter struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Type smartcontract.ParamType `json:"type"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method represents method's metadata.
|
// Method represents method's metadata.
|
||||||
type Method struct {
|
type Method struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
@ -22,14 +16,6 @@ type Method struct {
|
||||||
Safe bool `json:"safe"`
|
Safe bool `json:"safe"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewParameter returns new parameter of specified name and type.
|
|
||||||
func NewParameter(name string, typ smartcontract.ParamType) Parameter {
|
|
||||||
return Parameter{
|
|
||||||
Name: name,
|
|
||||||
Type: typ,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToStackItem converts Method to stackitem.Item.
|
// ToStackItem converts Method to stackitem.Item.
|
||||||
func (m *Method) ToStackItem() stackitem.Item {
|
func (m *Method) ToStackItem() stackitem.Item {
|
||||||
params := make([]stackitem.Item, len(m.Parameters))
|
params := make([]stackitem.Item, len(m.Parameters))
|
||||||
|
@ -91,36 +77,3 @@ func (m *Method) FromStackItem(item stackitem.Item) error {
|
||||||
m.Safe = safe
|
m.Safe = safe
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToStackItem converts Parameter to stackitem.Item.
|
|
||||||
func (p *Parameter) ToStackItem() stackitem.Item {
|
|
||||||
return stackitem.NewStruct([]stackitem.Item{
|
|
||||||
stackitem.Make(p.Name),
|
|
||||||
stackitem.Make(int(p.Type)),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromStackItem converts stackitem.Item to Parameter.
|
|
||||||
func (p *Parameter) FromStackItem(item stackitem.Item) error {
|
|
||||||
var err error
|
|
||||||
if item.Type() != stackitem.StructT {
|
|
||||||
return errors.New("invalid Parameter stackitem type")
|
|
||||||
}
|
|
||||||
param := item.Value().([]stackitem.Item)
|
|
||||||
if len(param) != 2 {
|
|
||||||
return errors.New("invalid Parameter stackitem length")
|
|
||||||
}
|
|
||||||
p.Name, err = stackitem.ToString(param[0])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
typ, err := param[1].TryInteger()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p.Type, err = smartcontract.ConvertToParamType(int(typ.Int64()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -52,34 +52,6 @@ func TestMethod_FromStackItemErrors(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParameter_ToStackItemFromStackItem(t *testing.T) {
|
|
||||||
p := &Parameter{
|
|
||||||
Name: "param",
|
|
||||||
Type: smartcontract.StringType,
|
|
||||||
}
|
|
||||||
expected := stackitem.NewStruct([]stackitem.Item{
|
|
||||||
stackitem.NewByteArray([]byte(p.Name)),
|
|
||||||
stackitem.NewBigInteger(big.NewInt(int64(p.Type))),
|
|
||||||
})
|
|
||||||
CheckToFromStackItem(t, p, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestParameter_FromStackItemErrors(t *testing.T) {
|
|
||||||
errCases := map[string]stackitem.Item{
|
|
||||||
"not a struct": stackitem.NewArray([]stackitem.Item{}),
|
|
||||||
"invalid length": stackitem.NewStruct([]stackitem.Item{}),
|
|
||||||
"invalid name type": stackitem.NewStruct([]stackitem.Item{stackitem.NewInterop(nil), stackitem.Null{}}),
|
|
||||||
"invalid type type": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.Null{}}),
|
|
||||||
"invalid type value": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.NewBigInteger(big.NewInt(-100500))}),
|
|
||||||
}
|
|
||||||
for name, errCase := range errCases {
|
|
||||||
t.Run(name, func(t *testing.T) {
|
|
||||||
p := new(Parameter)
|
|
||||||
require.Error(t, p.FromStackItem(errCase))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGroup_ToStackItemFromStackItem(t *testing.T) {
|
func TestGroup_ToStackItemFromStackItem(t *testing.T) {
|
||||||
pk, _ := keys.NewPrivateKey()
|
pk, _ := keys.NewPrivateKey()
|
||||||
g := &Group{
|
g := &Group{
|
||||||
|
|
56
pkg/smartcontract/manifest/parameter.go
Normal file
56
pkg/smartcontract/manifest/parameter.go
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
package manifest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Parameter represents smartcontract's parameter's definition.
|
||||||
|
type Parameter struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type smartcontract.ParamType `json:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewParameter returns new parameter of specified name and type.
|
||||||
|
func NewParameter(name string, typ smartcontract.ParamType) Parameter {
|
||||||
|
return Parameter{
|
||||||
|
Name: name,
|
||||||
|
Type: typ,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToStackItem converts Parameter to stackitem.Item.
|
||||||
|
func (p *Parameter) ToStackItem() stackitem.Item {
|
||||||
|
return stackitem.NewStruct([]stackitem.Item{
|
||||||
|
stackitem.Make(p.Name),
|
||||||
|
stackitem.Make(int(p.Type)),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromStackItem converts stackitem.Item to Parameter.
|
||||||
|
func (p *Parameter) FromStackItem(item stackitem.Item) error {
|
||||||
|
var err error
|
||||||
|
if item.Type() != stackitem.StructT {
|
||||||
|
return errors.New("invalid Parameter stackitem type")
|
||||||
|
}
|
||||||
|
param := item.Value().([]stackitem.Item)
|
||||||
|
if len(param) != 2 {
|
||||||
|
return errors.New("invalid Parameter stackitem length")
|
||||||
|
}
|
||||||
|
p.Name, err = stackitem.ToString(param[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
typ, err := param[1].TryInteger()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
p.Type, err = smartcontract.ConvertToParamType(int(typ.Int64()))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
38
pkg/smartcontract/manifest/parameter_test.go
Normal file
38
pkg/smartcontract/manifest/parameter_test.go
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
package manifest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/big"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestParameter_ToStackItemFromStackItem(t *testing.T) {
|
||||||
|
p := &Parameter{
|
||||||
|
Name: "param",
|
||||||
|
Type: smartcontract.StringType,
|
||||||
|
}
|
||||||
|
expected := stackitem.NewStruct([]stackitem.Item{
|
||||||
|
stackitem.NewByteArray([]byte(p.Name)),
|
||||||
|
stackitem.NewBigInteger(big.NewInt(int64(p.Type))),
|
||||||
|
})
|
||||||
|
CheckToFromStackItem(t, p, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParameter_FromStackItemErrors(t *testing.T) {
|
||||||
|
errCases := map[string]stackitem.Item{
|
||||||
|
"not a struct": stackitem.NewArray([]stackitem.Item{}),
|
||||||
|
"invalid length": stackitem.NewStruct([]stackitem.Item{}),
|
||||||
|
"invalid name type": stackitem.NewStruct([]stackitem.Item{stackitem.NewInterop(nil), stackitem.Null{}}),
|
||||||
|
"invalid type type": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.Null{}}),
|
||||||
|
"invalid type value": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.NewBigInteger(big.NewInt(-100500))}),
|
||||||
|
}
|
||||||
|
for name, errCase := range errCases {
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
p := new(Parameter)
|
||||||
|
require.Error(t, p.FromStackItem(errCase))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue