Commit c4291993 authored by mbohlool's avatar mbohlool

Generate inlined member's OpenAPI definitions

parent 6b702115
...@@ -236,6 +236,11 @@ func getReferableName(m *types.Member) string { ...@@ -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 { type openAPITypeWriter struct {
*generator.SnippetWriter *generator.SnippetWriter
refTypes map[string]*types.Type refTypes map[string]*types.Type
...@@ -271,6 +276,33 @@ func typeShortName(t *types.Type) string { ...@@ -271,6 +276,33 @@ func typeShortName(t *types.Type) string {
return filepath.Base(t.Name.Package) + "." + t.Name.Name 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 { func (g openAPITypeWriter) generate(t *types.Type) error {
// Only generate for struct type and ignore the rest // Only generate for struct type and ignore the rest
switch t.Kind { switch t.Kind {
...@@ -284,21 +316,9 @@ func (g openAPITypeWriter) generate(t *types.Type) error { ...@@ -284,21 +316,9 @@ func (g openAPITypeWriter) generate(t *types.Type) error {
g.Do("{\nSchema: spec.Schema{\nSchemaProps: spec.SchemaProps{\n", nil) g.Do("{\nSchema: spec.Schema{\nSchemaProps: spec.SchemaProps{\n", nil)
g.generateDescription(t.CommentLines) g.generateDescription(t.CommentLines)
g.Do("Properties: map[string]$.SpecSchemaType|raw${\n", args) g.Do("Properties: map[string]$.SpecSchemaType|raw${\n", args)
required := []string{} required, err := g.generateMembers(t, []string{})
for _, m := range t.Members { if err != nil {
if hasOpenAPITagValue(m.CommentLines, tagValueFalse) { return err
continue
}
name := getReferableName(&m)
if name == "" {
continue
}
if !hasOptionalTag(&m) {
required = append(required, name)
}
if err := g.generateProperty(&m); err != nil {
return err
}
} }
g.Do("},\n", nil) g.Do("},\n", nil)
if len(required) > 0 { if len(required) > 0 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment