From c4291993b6b9ad5bff9267c1d88f9e10e053e2ac Mon Sep 17 00:00:00 2001 From: mbohlool Date: Thu, 5 Jan 2017 03:23:50 -0800 Subject: [PATCH] Generate inlined member's OpenAPI definitions --- .../go2idl/openapi-gen/generators/openapi.go | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/cmd/libs/go2idl/openapi-gen/generators/openapi.go b/cmd/libs/go2idl/openapi-gen/generators/openapi.go index bd7f4ba9a7c..ca90c993ff4 100644 --- a/cmd/libs/go2idl/openapi-gen/generators/openapi.go +++ b/cmd/libs/go2idl/openapi-gen/generators/openapi.go @@ -236,6 +236,11 @@ func getReferableName(m *types.Member) string { } } +func shouldInlineMembers(m *types.Member) bool { + jsonTags := getJsonTags(m) + return len(jsonTags) > 1 && jsonTags[1] == "inline" +} + type openAPITypeWriter struct { *generator.SnippetWriter refTypes map[string]*types.Type @@ -271,6 +276,33 @@ func typeShortName(t *types.Type) string { return filepath.Base(t.Name.Package) + "." + t.Name.Name } +func (g openAPITypeWriter) generateMembers(t *types.Type, required []string) ([]string, error) { + var err error + for _, m := range t.Members { + if hasOpenAPITagValue(m.CommentLines, tagValueFalse) { + continue + } + if shouldInlineMembers(&m) { + required, err = g.generateMembers(m.Type, required) + if err != nil { + return required, err + } + continue + } + name := getReferableName(&m) + if name == "" { + continue + } + if !hasOptionalTag(&m) { + required = append(required, name) + } + if err = g.generateProperty(&m); err != nil { + return required, err + } + } + return required, nil +} + func (g openAPITypeWriter) generate(t *types.Type) error { // Only generate for struct type and ignore the rest switch t.Kind { @@ -284,21 +316,9 @@ func (g openAPITypeWriter) generate(t *types.Type) error { g.Do("{\nSchema: spec.Schema{\nSchemaProps: spec.SchemaProps{\n", nil) g.generateDescription(t.CommentLines) g.Do("Properties: map[string]$.SpecSchemaType|raw${\n", args) - required := []string{} - for _, m := range t.Members { - if hasOpenAPITagValue(m.CommentLines, tagValueFalse) { - continue - } - name := getReferableName(&m) - if name == "" { - continue - } - if !hasOptionalTag(&m) { - required = append(required, name) - } - if err := g.generateProperty(&m); err != nil { - return err - } + required, err := g.generateMembers(t, []string{}) + if err != nil { + return err } g.Do("},\n", nil) if len(required) > 0 {