Skip to content

Commit 3b85353

Browse files
committed
add support for symbol references in defaults
refactor openapi test to return import lines add symbol reference test
1 parent fe10d9b commit 3b85353

File tree

2 files changed

+146
-42
lines changed

2 files changed

+146
-42
lines changed

pkg/generators/openapi.go

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"sort"
2727
"strings"
2828

29+
defaultergen "k8s.io/gengo/examples/defaulter-gen/generators"
2930
"k8s.io/gengo/generator"
3031
"k8s.io/gengo/namer"
3132
"k8s.io/gengo/types"
@@ -120,7 +121,7 @@ func newOpenAPIGen(sanitizedName string, targetPackage string) generator.Generat
120121
DefaultGen: generator.DefaultGen{
121122
OptionalName: sanitizedName,
122123
},
123-
imports: generator.NewImportTracker(),
124+
imports: generator.NewImportTrackerForPackage(targetPackage),
124125
targetPackage: targetPackage,
125126
}
126127
}
@@ -553,19 +554,26 @@ func (g openAPITypeWriter) validatePatchTags(m *types.Member, parent *types.Type
553554
return nil
554555
}
555556

556-
func defaultFromComments(comments []string) (interface{}, error) {
557+
func defaultFromComments(comments []string, commentPath string) (interface{}, *types.Name, error) {
557558
tag, err := getSingleTagsValue(comments, tagDefault)
558559
if tag == "" {
559-
return nil, err
560+
return nil, nil, err
560561
}
561562
var i interface{}
562-
if err := json.Unmarshal([]byte(tag), &i); err != nil {
563-
return nil, fmt.Errorf("failed to unmarshal default: %v", err)
563+
if id, ok := defaultergen.ParseSymbolReference(tag, commentPath); ok {
564+
return nil, &id, nil
565+
} else if err := json.Unmarshal([]byte(tag), &i); err != nil {
566+
return nil, nil, fmt.Errorf("failed to unmarshal default: %v", err)
564567
}
565-
return i, nil
568+
return i, nil, nil
566569
}
567570

568571
func mustEnforceDefault(t *types.Type, omitEmpty bool) (interface{}, error) {
572+
// If t implements custom JSON marshalling, all of this logic is likely wrong
573+
if _, isUnmarshaller := t.Methods["UnmarshalJSON"]; isUnmarshaller {
574+
return nil, nil
575+
}
576+
569577
switch t.Kind {
570578
case types.Pointer, types.Map, types.Slice, types.Array, types.Interface:
571579
return nil, nil
@@ -585,9 +593,10 @@ func mustEnforceDefault(t *types.Type, omitEmpty bool) (interface{}, error) {
585593
}
586594
}
587595

588-
func (g openAPITypeWriter) generateDefault(comments []string, t *types.Type, omitEmpty bool) error {
596+
func (g openAPITypeWriter) generateDefault(comments []string, t *types.Type, omitEmpty bool, commentOwningType *types.Type) error {
589597
t = resolveAliasAndEmbeddedType(t)
590-
def, err := defaultFromComments(comments)
598+
599+
def, ref, err := defaultFromComments(comments, commentOwningType.Name.Package)
591600
if err != nil {
592601
return err
593602
}
@@ -603,6 +612,8 @@ func (g openAPITypeWriter) generateDefault(comments []string, t *types.Type, omi
603612
}
604613
if def != nil {
605614
g.Do("Default: $.$,\n", fmt.Sprintf("%#v", def))
615+
} else if ref != nil {
616+
g.Do("Default: $.|raw$,\n", &types.Type{Name: *ref})
606617
}
607618
return nil
608619
}
@@ -676,7 +687,7 @@ func (g openAPITypeWriter) generateProperty(m *types.Member, parent *types.Type)
676687
return nil
677688
}
678689
omitEmpty := strings.Contains(reflect.StructTag(m.Tags).Get("json"), "omitempty")
679-
if err := g.generateDefault(m.CommentLines, m.Type, omitEmpty); err != nil {
690+
if err := g.generateDefault(m.CommentLines, m.Type, omitEmpty, parent); err != nil {
680691
return fmt.Errorf("failed to generate default in %v: %v: %v", parent, m.Name, err)
681692
}
682693
t := resolveAliasAndPtrType(m.Type)
@@ -762,7 +773,7 @@ func (g openAPITypeWriter) generateMapProperty(t *types.Type) error {
762773

763774
g.Do("Type: []string{\"object\"},\n", nil)
764775
g.Do("AdditionalProperties: &spec.SchemaOrBool{\nAllows: true,\nSchema: &spec.Schema{\nSchemaProps: spec.SchemaProps{\n", nil)
765-
if err := g.generateDefault(t.Elem.CommentLines, t.Elem, false); err != nil {
776+
if err := g.generateDefault(t.Elem.CommentLines, t.Elem, false, t.Elem); err != nil {
766777
return err
767778
}
768779
typeString, format := openapi.OpenAPITypeFormat(elemType.String())
@@ -795,7 +806,7 @@ func (g openAPITypeWriter) generateSliceProperty(t *types.Type) error {
795806
elemType := resolveAliasAndPtrType(t.Elem)
796807
g.Do("Type: []string{\"array\"},\n", nil)
797808
g.Do("Items: &spec.SchemaOrArray{\nSchema: &spec.Schema{\nSchemaProps: spec.SchemaProps{\n", nil)
798-
if err := g.generateDefault(t.Elem.CommentLines, t.Elem, false); err != nil {
809+
if err := g.generateDefault(t.Elem.CommentLines, t.Elem, false, t.Elem); err != nil {
799810
return err
800811
}
801812
typeString, format := openapi.OpenAPITypeFormat(elemType.String())

0 commit comments

Comments
 (0)