diff --git a/pkg/util/uint160.go b/pkg/util/uint160.go index 991183e0f..3ce5b65ae 100644 --- a/pkg/util/uint160.go +++ b/pkg/util/uint160.go @@ -135,6 +135,25 @@ func (u Uint160) MarshalJSON() ([]byte, error) { return []byte(`"0x` + u.StringLE() + `"`), nil } +// UnmarshalYAML implements the YAML Unmarshaler interface. +func (u *Uint160) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + + err := unmarshal(&s) + if err != nil { + return err + } + + s = strings.TrimPrefix(s, "0x") + *u, err = Uint160DecodeStringLE(s) + return err +} + +// MarshalYAML implements the YAML marshaller interface. +func (u Uint160) MarshalYAML() (interface{}, error) { + return "0x" + u.StringLE(), nil +} + // EncodeBinary implements Serializable interface. func (u *Uint160) EncodeBinary(bw *io.BinWriter) { bw.WriteBytes(u[:]) diff --git a/pkg/util/uint160_test.go b/pkg/util/uint160_test.go index f6bc855a2..fead28080 100644 --- a/pkg/util/uint160_test.go +++ b/pkg/util/uint160_test.go @@ -8,6 +8,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gopkg.in/yaml.v2" ) func TestUint160UnmarshalJSON(t *testing.T) { @@ -26,6 +27,23 @@ func TestUint160UnmarshalJSON(t *testing.T) { assert.Error(t, u2.UnmarshalJSON([]byte(`123`))) } +func TestUint160UnmarshalYAML(t *testing.T) { + str := "0263c1de100292813b5e075e585acc1bae963b2d" + expected, err := util.Uint160DecodeStringLE(str) + assert.NoError(t, err) + + var u1, u2 util.Uint160 + require.NoError(t, yaml.Unmarshal([]byte(`"`+str+`"`), &u1)) + require.Equal(t, expected, u1) + + data, err := yaml.Marshal(u1) + require.NoError(t, err) + require.NoError(t, yaml.Unmarshal(data, &u2)) + require.Equal(t, expected, u2) + + require.Error(t, yaml.Unmarshal([]byte(`[]`), &u1)) +} + func TestUInt160DecodeString(t *testing.T) { hexStr := "2d3b96ae1bcc5a585e075e3b81920210dec16302" val, err := util.Uint160DecodeStringBE(hexStr)