Allow to marshal pointer to struct and map (#247)
This commit is contained in:
committed by
Thomas Pelletier
parent
0a1666a81f
commit
19cbd226da
+10
-2
@@ -244,9 +244,17 @@ func (e *Encoder) SetTagMultiline(v string) *Encoder {
|
|||||||
|
|
||||||
func (e *Encoder) marshal(v interface{}) ([]byte, error) {
|
func (e *Encoder) marshal(v interface{}) ([]byte, error) {
|
||||||
mtype := reflect.TypeOf(v)
|
mtype := reflect.TypeOf(v)
|
||||||
if mtype.Kind() != reflect.Struct {
|
|
||||||
return []byte{}, errors.New("Only a struct can be marshaled to TOML")
|
switch mtype.Kind() {
|
||||||
|
case reflect.Struct, reflect.Map:
|
||||||
|
case reflect.Ptr:
|
||||||
|
if mtype.Elem().Kind() != reflect.Struct {
|
||||||
|
return []byte{}, errors.New("Only pointer to struct can be marshaled to TOML")
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return []byte{}, errors.New("Only a struct or map can be marshaled to TOML")
|
||||||
}
|
}
|
||||||
|
|
||||||
sval := reflect.ValueOf(v)
|
sval := reflect.ValueOf(v)
|
||||||
if isCustomMarshaler(mtype) {
|
if isCustomMarshaler(mtype) {
|
||||||
return callCustomMarshaler(sval)
|
return callCustomMarshaler(sval)
|
||||||
|
|||||||
+45
-4
@@ -53,6 +53,17 @@ func TestBasicMarshal(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBasicMarshalWithPointer(t *testing.T) {
|
||||||
|
result, err := Marshal(&basicTestData)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
expected := basicTestToml
|
||||||
|
if !bytes.Equal(result, expected) {
|
||||||
|
t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestBasicUnmarshal(t *testing.T) {
|
func TestBasicUnmarshal(t *testing.T) {
|
||||||
result := basicMarshalTestStruct{}
|
result := basicMarshalTestStruct{}
|
||||||
err := Unmarshal(basicTestToml, &result)
|
err := Unmarshal(basicTestToml, &result)
|
||||||
@@ -163,6 +174,17 @@ func TestDocMarshal(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDocMarshalPointer(t *testing.T) {
|
||||||
|
result, err := Marshal(&docData)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
expected, _ := ioutil.ReadFile("marshal_test.toml")
|
||||||
|
if !bytes.Equal(result, expected) {
|
||||||
|
t.Errorf("Bad marshal: expected\n-----\n%s\n-----\ngot\n-----\n%s\n-----\n", expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestDocUnmarshal(t *testing.T) {
|
func TestDocUnmarshal(t *testing.T) {
|
||||||
result := testDoc{}
|
result := testDoc{}
|
||||||
tomlData, _ := ioutil.ReadFile("marshal_test.toml")
|
tomlData, _ := ioutil.ReadFile("marshal_test.toml")
|
||||||
@@ -992,13 +1014,32 @@ func TestUnmarshalMap(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMarshalMap(t *testing.T) {
|
func TestMarshalSlice(t *testing.T) {
|
||||||
m := make(map[string]int)
|
m := make([]int, 1)
|
||||||
m["a"] = 1
|
m[0] = 1
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
err := NewEncoder(&buf).Encode(&m)
|
||||||
|
if err == nil {
|
||||||
|
t.Error("expected error, got nil")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err.Error() != "Only pointer to struct can be marshaled to TOML" {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMarshalSlicePointer(t *testing.T) {
|
||||||
|
m := make([]int, 1)
|
||||||
|
m[0] = 1
|
||||||
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
err := NewEncoder(&buf).Encode(m)
|
err := NewEncoder(&buf).Encode(m)
|
||||||
if err.Error() != "Only a struct can be marshaled to TOML" {
|
if err == nil {
|
||||||
|
t.Error("expected error, got nil")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err.Error() != "Only a struct or map can be marshaled to TOML" {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user