88 "path"
99 "path/filepath"
1010
11+ "golang.org/x/text/cases"
12+ "golang.org/x/text/language"
1113 "golang.org/x/tools/go/packages"
1214)
1315
@@ -61,7 +63,14 @@ func Generate(clientsToGenerateList []ClientsToGenerate, outputDir string) error
6163 if client .PackageNameOverride != "" {
6264 packageName = client .PackageNameOverride
6365 }
64- code := generateWrapper (ts .Name .Name , iface , client .GrpcPackagePath , packageName , client .Suffix )
66+ // In order to counter package name fatigue (policy.attributes.AttributesService),
67+ // newer services are simply named "Service" (policy.obligations.Service).
68+ // This prefix logic is necessary for newer services.
69+ prefix := ""
70+ if ts .Name .Name == "ServiceClient" {
71+ prefix = cases .Title (language .English ).String (packageName )
72+ }
73+ code := generateWrapper (ts .Name .Name , iface , client .GrpcPackagePath , packageName , prefix , client .Suffix )
6574 outputPath := filepath .Join (outputDir , packageName + ".go" )
6675 err = os .WriteFile (outputPath , []byte (code ), 0o644 ) //nolint:gosec // ignore G306
6776 if err != nil {
@@ -105,13 +114,13 @@ func getMethodNames(interfaceType *ast.InterfaceType) []string {
105114}
106115
107116// Generate wrapper code for the Connect RPC client interface
108- func generateWrapper (interfaceName string , interfaceType * ast.InterfaceType , packagePath string , packageName string , suffix string ) string {
117+ func generateWrapper (interfaceName string , interfaceType * ast.InterfaceType , packagePath , packageName , prefix , suffix string ) string {
109118 // Get method names dynamically from the interface
110119 methods := getMethodNames (interfaceType )
111120 connectPackageName := packageName + "connect"
112121
113122 // Start generating the wrapper code
114- wrapperCode := fmt .Sprintf (`// Wrapper for %s (generated code) DO NOT EDIT
123+ wrapperCode := fmt .Sprintf (`// Wrapper for %s%s (generated code) DO NOT EDIT
115124package sdkconnect
116125
117126import (
@@ -121,47 +130,52 @@ import (
121130 "%s"
122131)
123132
124- type %s%sConnectWrapper struct {
133+ type %s%s% sConnectWrapper struct {
125134 %s.%s
126135}
127136
128- func New%s%sConnectWrapper(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) *%s%sConnectWrapper {
129- return &%s%sConnectWrapper{%s: %s.New%s(httpClient, baseURL, opts...)}
137+ func New%s%s% sConnectWrapper(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) *%s %s%sConnectWrapper {
138+ return &%s%s% sConnectWrapper{%s: %s.New%s(httpClient, baseURL, opts...)}
130139}
131140` ,
141+ prefix ,
132142 interfaceName ,
133143 packagePath ,
134144 packagePath + "/" + connectPackageName ,
145+ prefix ,
135146 interfaceName ,
136147 suffix ,
137148 connectPackageName ,
138149 interfaceName ,
150+ prefix ,
139151 interfaceName ,
140152 suffix ,
153+ prefix ,
141154 interfaceName ,
142155 suffix ,
156+ prefix ,
143157 interfaceName ,
144158 suffix ,
145159 interfaceName ,
146160 connectPackageName ,
147161 interfaceName )
148162
149163 // Generate the interface type definition
150- wrapperCode += generateInterfaceType (interfaceName , methods , packageName , suffix )
164+ wrapperCode += generateInterfaceType (interfaceName , methods , packageName , prefix , suffix )
151165 // Now generate a wrapper function for each method in the interface
152166 for _ , method := range methods {
153- wrapperCode += generateWrapperMethod (interfaceName , method , packageName , suffix )
167+ wrapperCode += generateWrapperMethod (interfaceName , method , packageName , prefix , suffix )
154168 }
155169
156170 // Output the generated wrapper code
157171 return wrapperCode
158172}
159173
160- func generateInterfaceType (interfaceName string , methods []string , packageName string , suffix string ) string {
174+ func generateInterfaceType (interfaceName string , methods []string , packageName , prefix , suffix string ) string {
161175 // Generate the interface type definition
162176 interfaceType := fmt .Sprintf (`
163- type %s%s interface {
164- ` , interfaceName , suffix )
177+ type %s%s%s interface {
178+ ` , prefix , interfaceName , suffix )
165179 for _ , method := range methods {
166180 interfaceType += fmt .Sprintf (` %s(ctx context.Context, req *%s.%sRequest) (*%s.%sResponse, error)
167181` , method , packageName , method , packageName , method )
@@ -171,15 +185,15 @@ type %s%s interface {
171185}
172186
173187// Generate the wrapper method for a specific method in the interface
174- func generateWrapperMethod (interfaceName , methodName , packageName string , suffix string ) string {
188+ func generateWrapperMethod (interfaceName , methodName , packageName , prefix , suffix string ) string {
175189 return fmt .Sprintf (`
176- func (w *%s%sConnectWrapper) %s(ctx context.Context, req *%s.%sRequest) (*%s.%sResponse, error) {
190+ func (w *%s%s% sConnectWrapper) %s(ctx context.Context, req *%s.%sRequest) (*%s.%sResponse, error) {
177191 // Wrap Connect RPC client request
178192 res, err := w.%s.%s(ctx, connect.NewRequest(req))
179193 if res == nil {
180194 return nil, err
181195 }
182196 return res.Msg, err
183197}
184- ` , interfaceName , suffix , methodName , packageName , methodName , packageName , methodName , interfaceName , methodName )
198+ ` , prefix , interfaceName , suffix , methodName , packageName , methodName , packageName , methodName , interfaceName , methodName )
185199}
0 commit comments