Decode: unstable/Unmarshal interface (#940)
Co-authored-by: Pavlos Karakalidis <pkarakal@pkarakal.com> Co-authored-by: Thomas Pelletier <thomas@pelletier.codes>
This commit is contained in:
@@ -12,6 +12,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/pelletier/go-toml/v2"
|
||||
"github.com/pelletier/go-toml/v2/unstable"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -3772,3 +3773,95 @@ func TestUnmarshal_Nil(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type CustomUnmarshalerKey struct {
|
||||
A int64
|
||||
}
|
||||
|
||||
func (k *CustomUnmarshalerKey) UnmarshalTOML(value *unstable.Node) error {
|
||||
item, err := strconv.ParseInt(string(value.Data), 10, 64)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error converting to int64, %v", err)
|
||||
}
|
||||
k.A = item
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func TestUnmarshal_CustomUnmarshaler(t *testing.T) {
|
||||
type MyConfig struct {
|
||||
Unmarshalers []CustomUnmarshalerKey `toml:"unmarshalers"`
|
||||
Foo *string `toml:"foo,omitempty"`
|
||||
}
|
||||
|
||||
examples := []struct {
|
||||
desc string
|
||||
disableUnmarshalerInterface bool
|
||||
input string
|
||||
expected MyConfig
|
||||
err bool
|
||||
}{
|
||||
{
|
||||
desc: "empty",
|
||||
input: ``,
|
||||
expected: MyConfig{Unmarshalers: []CustomUnmarshalerKey{}, Foo: nil},
|
||||
},
|
||||
{
|
||||
desc: "simple",
|
||||
input: `unmarshalers = [1,2,3]`,
|
||||
expected: MyConfig{
|
||||
Unmarshalers: []CustomUnmarshalerKey{
|
||||
{A: 1},
|
||||
{A: 2},
|
||||
{A: 3},
|
||||
},
|
||||
Foo: nil,
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "unmarshal string and custom unmarshaler",
|
||||
input: `unmarshalers = [1,2,3]
|
||||
foo = "bar"`,
|
||||
expected: MyConfig{
|
||||
Unmarshalers: []CustomUnmarshalerKey{
|
||||
{A: 1},
|
||||
{A: 2},
|
||||
{A: 3},
|
||||
},
|
||||
Foo: func(v string) *string {
|
||||
return &v
|
||||
}("bar"),
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "simple example, but unmarshaler interface disabled",
|
||||
disableUnmarshalerInterface: true,
|
||||
input: `unmarshalers = [1,2,3]`,
|
||||
err: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, ex := range examples {
|
||||
e := ex
|
||||
t.Run(e.desc, func(t *testing.T) {
|
||||
foo := MyConfig{}
|
||||
|
||||
decoder := toml.NewDecoder(bytes.NewReader([]byte(e.input)))
|
||||
if !ex.disableUnmarshalerInterface {
|
||||
decoder.EnableUnmarshalerInterface()
|
||||
}
|
||||
err := decoder.Decode(&foo)
|
||||
|
||||
if e.err {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, len(foo.Unmarshalers), len(e.expected.Unmarshalers))
|
||||
for i := 0; i < len(foo.Unmarshalers); i++ {
|
||||
require.Equal(t, foo.Unmarshalers[i], e.expected.Unmarshalers[i])
|
||||
}
|
||||
require.Equal(t, foo.Foo, e.expected.Foo)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user