From 2ea6ed0ea8d20091ff80b30ab47e206e776e7c53 Mon Sep 17 00:00:00 2001 From: Victor Starodub Date: Fri, 7 Oct 2016 15:52:17 +0300 Subject: [PATCH] Allow marshalling "named" maps. --- gen/decoder.go | 14 +++++++++----- gen/encoder.go | 20 ++++++++++++-------- tests/basic_test.go | 1 + tests/data.go | 7 +++++++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/gen/decoder.go b/gen/decoder.go index 0688e5d..681584f 100644 --- a/gen/decoder.go +++ b/gen/decoder.go @@ -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) diff --git a/gen/encoder.go b/gen/encoder.go index ba9053f..06303e0 100644 --- a/gen/encoder.go +++ b/gen/encoder.go @@ -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) diff --git a/tests/basic_test.go b/tests/basic_test.go index a5d6236..3e994ea 100644 --- a/tests/basic_test.go +++ b/tests/basic_test.go @@ -35,6 +35,7 @@ var testCases = []struct { {&mapsValue, mapsString}, {&deepNestValue, deepNestString}, {&IntsValue, IntsString}, + {&mapStringStringValue, mapStringStringString}, } func TestMarshal(t *testing.T) { diff --git a/tests/data.go b/tests/data.go index 0fe15d5..1716617 100644 --- a/tests/data.go +++ b/tests/data.go @@ -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"`