diff --git a/cmd/libs/go2idl/client-gen/generators/client_generator.go b/cmd/libs/go2idl/client-gen/generators/client_generator.go index cafb98ee5fe..6cc6783cd6b 100644 --- a/cmd/libs/go2idl/client-gen/generators/client_generator.go +++ b/cmd/libs/go2idl/client-gen/generators/client_generator.go @@ -39,13 +39,15 @@ func NameSystems() namer.NameSystems { pluralExceptions := map[string]string{ "Endpoints": "Endpoints", } + lowercaseNamer := namer.NewAllLowercasePluralNamer(pluralExceptions) return namer.NameSystems{ "public": namer.NewPublicNamer(0), "private": namer.NewPrivateNamer(0), "raw": namer.NewRawNamer("", nil), "publicPlural": namer.NewPublicPluralNamer(pluralExceptions), "privatePlural": namer.NewPrivatePluralNamer(pluralExceptions), - "allLowercasePlural": namer.NewAllLowercasePluralNamer(pluralExceptions), + "allLowercasePlural": lowercaseNamer, + "resource": NewTagOverrideNamer("resourceName", lowercaseNamer), } } @@ -279,3 +281,27 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat return generator.Packages(packageList) } + +// tagOverrideNamer is a namer which pulls names from a given tag, if specified, +// and otherwise falls back to a different namer. +type tagOverrideNamer struct { + tagName string + fallback namer.Namer +} + +func (n *tagOverrideNamer) Name(t *types.Type) string { + if nameOverride := extractTag(n.tagName, t.SecondClosestCommentLines); nameOverride != "" { + return nameOverride + } + + return n.fallback.Name(t) +} + +// NewTagOverrideNamer creates a namer.Namer which uses the contents of the given tag as +// the name, or falls back to another Namer if the tag is not present. +func NewTagOverrideNamer(tagName string, fallback namer.Namer) namer.Namer { + return &tagOverrideNamer{ + tagName: tagName, + fallback: fallback, + } +} diff --git a/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_type.go b/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_type.go index c5c58719033..bf98a0da0de 100644 --- a/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_type.go +++ b/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_type.go @@ -197,7 +197,7 @@ type Fake$.type|publicPlural$ struct { ` var resource = ` -var $.type|allLowercasePlural$Resource = $.GroupVersionResource|raw${Group: "$.groupName$", Version: "$.version$", Resource: "$.type|allLowercasePlural$"} +var $.type|allLowercasePlural$Resource = $.GroupVersionResource|raw${Group: "$.groupName$", Version: "$.version$", Resource: "$.type|resource$"} ` var kind = ` diff --git a/cmd/libs/go2idl/client-gen/generators/generator_for_type.go b/cmd/libs/go2idl/client-gen/generators/generator_for_type.go index f2781ce595e..8fc4cbca147 100644 --- a/cmd/libs/go2idl/client-gen/generators/generator_for_type.go +++ b/cmd/libs/go2idl/client-gen/generators/generator_for_type.go @@ -224,7 +224,7 @@ func (c *$.type|privatePlural$) List(opts $.ListOptions|raw$) (result *$.type|ra result = &$.type|raw$List{} err = c.client.Get(). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). VersionedParams(&opts, $.schemeParameterCodec|raw$). Do(). Into(result) @@ -237,7 +237,7 @@ func (c *$.type|privatePlural$) Get(name string, options $.GetOptions|raw$) (res result = &$.type|raw${} err = c.client.Get(). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). Name(name). VersionedParams(&options, $.schemeParameterCodec|raw$). Do(). @@ -251,7 +251,7 @@ var deleteTemplate = ` func (c *$.type|privatePlural$) Delete(name string, options *$.DeleteOptions|raw$) error { return c.client.Delete(). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). Name(name). Body(options). Do(). @@ -264,7 +264,7 @@ var deleteCollectionTemplate = ` func (c *$.type|privatePlural$) DeleteCollection(options *$.DeleteOptions|raw$, listOptions $.ListOptions|raw$) error { return c.client.Delete(). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). VersionedParams(&listOptions, $.schemeParameterCodec|raw$). Body(options). Do(). @@ -278,7 +278,7 @@ func (c *$.type|privatePlural$) Create($.type|private$ *$.type|raw$) (result *$. result = &$.type|raw${} err = c.client.Post(). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). Body($.type|private$). Do(). Into(result) @@ -292,7 +292,7 @@ func (c *$.type|privatePlural$) Update($.type|private$ *$.type|raw$) (result *$. result = &$.type|raw${} err = c.client.Put(). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). Name($.type|private$.Name). Body($.type|private$). Do(). @@ -309,7 +309,7 @@ func (c *$.type|privatePlural$) UpdateStatus($.type|private$ *$.type|raw$) (resu result = &$.type|raw${} err = c.client.Put(). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). Name($.type|private$.Name). SubResource("status"). Body($.type|private$). @@ -325,7 +325,7 @@ func (c *$.type|privatePlural$) Watch(opts $.ListOptions|raw$) ($.watchInterface opts.Watch = true return c.client.Get(). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). VersionedParams(&opts, $.schemeParameterCodec|raw$). Watch() } @@ -337,7 +337,7 @@ func (c *$.type|privatePlural$) Patch(name string, pt $.PatchType|raw$, data []b result = &$.type|raw${} err = c.client.Patch(pt). $if .namespaced$Namespace(c.ns).$end$ - Resource("$.type|allLowercasePlural$"). + Resource("$.type|resource$"). SubResource(subresources...). Name(name). Body(data). diff --git a/cmd/libs/go2idl/client-gen/generators/tags.go b/cmd/libs/go2idl/client-gen/generators/tags.go index 34aa77231fa..063559c09e1 100644 --- a/cmd/libs/go2idl/client-gen/generators/tags.go +++ b/cmd/libs/go2idl/client-gen/generators/tags.go @@ -31,3 +31,14 @@ func extractBoolTagOrDie(key string, lines []string) bool { } return val } + +// extractTag gets the comment-tags for the key. If the tag did not exist, it +// returns the empty string. +func extractTag(key string, lines []string) string { + val, present := types.ExtractCommentTags("+", lines)[key] + if !present || len(val) < 1 { + return "" + } + + return val[0] +}