Allow marshalling "named" maps.

This commit is contained in:
Victor Starodub
2016-10-07 15:52:17 +03:00
parent a575905062
commit 2ea6ed0ea8
4 changed files with 29 additions and 13 deletions
+9 -5
View File
@@ -322,7 +322,7 @@ func getStructFields(t reflect.Type) ([]reflect.StructField, error) {
func (g *Generator) genDecoder(t reflect.Type) error {
switch t.Kind() {
case reflect.Slice, reflect.Array:
case reflect.Slice, reflect.Array, reflect.Map:
return g.genSliceArrayDecoder(t)
default:
return g.genStructDecoder(t)
@@ -330,8 +330,10 @@ func (g *Generator) genDecoder(t reflect.Type) error {
}
func (g *Generator) genSliceArrayDecoder(t reflect.Type) error {
if t.Kind() != reflect.Slice && t.Kind() != reflect.Array {
return fmt.Errorf("cannot generate encoder/decoder for %v, not a slice or array type", t)
switch t.Kind() {
case reflect.Slice, reflect.Array, reflect.Map:
default:
return fmt.Errorf("cannot generate encoder/decoder for %v, not a slice/array/map type", t)
}
fname := g.getDecoderName(t)
@@ -413,8 +415,10 @@ func (g *Generator) genStructDecoder(t reflect.Type) error {
}
func (g *Generator) genStructUnmarshaller(t reflect.Type) error {
if t.Kind() != reflect.Struct && t.Kind() != reflect.Slice && t.Kind() != reflect.Array {
return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct/slice/array type", t)
switch t.Kind() {
case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct:
default:
return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct/slice/array/map type", t)
}
fname := g.getDecoderName(t)
+12 -8
View File
@@ -266,16 +266,18 @@ func (g *Generator) genStructFieldEncoder(t reflect.Type, f reflect.StructField)
func (g *Generator) genEncoder(t reflect.Type) error {
switch t.Kind() {
case reflect.Slice, reflect.Array:
return g.genSliceArrayEncoder(t)
case reflect.Slice, reflect.Array, reflect.Map:
return g.genSliceArrayMapEncoder(t)
default:
return g.genStructEncoder(t)
}
}
func (g *Generator) genSliceArrayEncoder(t reflect.Type) error {
if t.Kind() != reflect.Slice && t.Kind() != reflect.Array {
return fmt.Errorf("cannot generate encoder/decoder for %v, not a slice or array type", t)
func (g *Generator) genSliceArrayMapEncoder(t reflect.Type) error {
switch t.Kind() {
case reflect.Slice, reflect.Array, reflect.Map:
default:
return fmt.Errorf("cannot generate encoder/decoder for %v, not a slice/array/map type", t)
}
fname := g.getEncoderName(t)
@@ -292,7 +294,7 @@ func (g *Generator) genSliceArrayEncoder(t reflect.Type) error {
func (g *Generator) genStructEncoder(t reflect.Type) error {
if t.Kind() != reflect.Struct {
return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct type")
return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct type", t)
}
fname := g.getEncoderName(t)
@@ -320,8 +322,10 @@ func (g *Generator) genStructEncoder(t reflect.Type) error {
}
func (g *Generator) genStructMarshaller(t reflect.Type) error {
if t.Kind() != reflect.Struct && t.Kind() != reflect.Slice && t.Kind() != reflect.Array {
return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct/slice/array type", t)
switch t.Kind() {
case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct:
default:
return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct/slice/array/map type", t)
}
fname := g.getEncoderName(t)
+1
View File
@@ -35,6 +35,7 @@ var testCases = []struct {
{&mapsValue, mapsString},
{&deepNestValue, deepNestString},
{&IntsValue, IntsString},
{&mapStringStringValue, mapStringStringString},
}
func TestMarshal(t *testing.T) {
+7
View File
@@ -613,6 +613,13 @@ var IntsValue = Ints{1, 2, 3, 4, 5}
var IntsString = `[1,2,3,4,5]`
//easyjson:json
type MapStringString map[string]string
var mapStringStringValue = MapStringString{"a": "b"}
var mapStringStringString = `{"a":"b"}`
type RequiredOptionalStruct struct {
FirstName string `json:"first_name,required"`
Lastname string `json:"last_name"`