util: add YAML marshaler to Fixed8

This commit is contained in:
Evgenii Stratonikov 2020-01-22 09:58:24 +03:00
parent 7a6d6f43ce
commit 2f865480d3
2 changed files with 33 additions and 2 deletions

View file

@ -87,8 +87,20 @@ func Fixed8FromString(s string) (Fixed8, error) {
// UnmarshalJSON implements the json unmarshaller interface. // UnmarshalJSON implements the json unmarshaller interface.
func (f *Fixed8) UnmarshalJSON(data []byte) error { func (f *Fixed8) UnmarshalJSON(data []byte) error {
return f.unmarshalHelper(func(v interface{}) error {
return json.Unmarshal(data, v)
})
}
// UnmarshalYAML implements the yaml unmarshaler interface.
func (f *Fixed8) UnmarshalYAML(unmarshal func(interface{}) error) error {
return f.unmarshalHelper(unmarshal)
}
// unmarshalHelper is an underlying unmarshaller func for JSON and YAML.
func (f *Fixed8) unmarshalHelper(unmarshal func(interface{}) error) error {
var s string var s string
if err := json.Unmarshal(data, &s); err == nil { if err := unmarshal(&s); err == nil {
p, err := Fixed8FromString(s) p, err := Fixed8FromString(s)
if err != nil { if err != nil {
return err return err
@ -98,7 +110,7 @@ func (f *Fixed8) UnmarshalJSON(data []byte) error {
} }
var fl float64 var fl float64
if err := json.Unmarshal(data, &fl); err != nil { if err := unmarshal(&fl); err != nil {
return err return err
} }
@ -111,6 +123,11 @@ func (f Fixed8) MarshalJSON() ([]byte, error) {
return []byte(`"` + f.String() + `"`), nil return []byte(`"` + f.String() + `"`), nil
} }
// MarshalYAML implements the yaml marshaller interface.
func (f Fixed8) MarshalYAML() (interface{}, error) {
return f.String(), nil
}
// DecodeBinary implements the io.Serializable interface. // DecodeBinary implements the io.Serializable interface.
func (f *Fixed8) DecodeBinary(r *io.BinReader) { func (f *Fixed8) DecodeBinary(r *io.BinReader) {
*f = Fixed8(r.ReadU64LE()) *f = Fixed8(r.ReadU64LE())

View file

@ -6,6 +6,7 @@ import (
"testing" "testing"
"github.com/CityOfZion/neo-go/pkg/io" "github.com/CityOfZion/neo-go/pkg/io"
"github.com/go-yaml/yaml"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@ -125,6 +126,19 @@ func TestFixed8_MarshalJSON(t *testing.T) {
assert.Equal(t, []byte(`"123.4"`), s) assert.Equal(t, []byte(`"123.4"`), s)
} }
func TestFixed8_UnmarshalYAML(t *testing.T) {
u, err := Fixed8FromString("123.4")
assert.NoError(t, err)
s, err := yaml.Marshal(u)
assert.NoError(t, err)
assert.Equal(t, []byte("\"123.4\"\n"), s) // yaml marshaler inserts LF at the end
var f Fixed8
assert.NoError(t, yaml.Unmarshal([]byte(`"123.4"`), &f))
assert.Equal(t, u, f)
}
func TestFixed8_Arith(t *testing.T) { func TestFixed8_Arith(t *testing.T) {
u1 := Fixed8FromInt64(3) u1 := Fixed8FromInt64(3)
u2 := Fixed8FromInt64(8) u2 := Fixed8FromInt64(8)