8
8
"path"
9
9
"path/filepath"
10
10
11
+ "golang.org/x/text/cases"
12
+ "golang.org/x/text/language"
11
13
"golang.org/x/tools/go/packages"
12
14
)
13
15
@@ -61,7 +63,14 @@ func Generate(clientsToGenerateList []ClientsToGenerate, outputDir string) error
61
63
if client .PackageNameOverride != "" {
62
64
packageName = client .PackageNameOverride
63
65
}
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 )
65
74
outputPath := filepath .Join (outputDir , packageName + ".go" )
66
75
err = os .WriteFile (outputPath , []byte (code ), 0o644 ) //nolint:gosec // ignore G306
67
76
if err != nil {
@@ -105,13 +114,13 @@ func getMethodNames(interfaceType *ast.InterfaceType) []string {
105
114
}
106
115
107
116
// 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 {
109
118
// Get method names dynamically from the interface
110
119
methods := getMethodNames (interfaceType )
111
120
connectPackageName := packageName + "connect"
112
121
113
122
// 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
115
124
package sdkconnect
116
125
117
126
import (
@@ -121,47 +130,52 @@ import (
121
130
"%s"
122
131
)
123
132
124
- type %s%sConnectWrapper struct {
133
+ type %s%s% sConnectWrapper struct {
125
134
%s.%s
126
135
}
127
136
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...)}
130
139
}
131
140
` ,
141
+ prefix ,
132
142
interfaceName ,
133
143
packagePath ,
134
144
packagePath + "/" + connectPackageName ,
145
+ prefix ,
135
146
interfaceName ,
136
147
suffix ,
137
148
connectPackageName ,
138
149
interfaceName ,
150
+ prefix ,
139
151
interfaceName ,
140
152
suffix ,
153
+ prefix ,
141
154
interfaceName ,
142
155
suffix ,
156
+ prefix ,
143
157
interfaceName ,
144
158
suffix ,
145
159
interfaceName ,
146
160
connectPackageName ,
147
161
interfaceName )
148
162
149
163
// Generate the interface type definition
150
- wrapperCode += generateInterfaceType (interfaceName , methods , packageName , suffix )
164
+ wrapperCode += generateInterfaceType (interfaceName , methods , packageName , prefix , suffix )
151
165
// Now generate a wrapper function for each method in the interface
152
166
for _ , method := range methods {
153
- wrapperCode += generateWrapperMethod (interfaceName , method , packageName , suffix )
167
+ wrapperCode += generateWrapperMethod (interfaceName , method , packageName , prefix , suffix )
154
168
}
155
169
156
170
// Output the generated wrapper code
157
171
return wrapperCode
158
172
}
159
173
160
- func generateInterfaceType (interfaceName string , methods []string , packageName string , suffix string ) string {
174
+ func generateInterfaceType (interfaceName string , methods []string , packageName , prefix , suffix string ) string {
161
175
// Generate the interface type definition
162
176
interfaceType := fmt .Sprintf (`
163
- type %s%s interface {
164
- ` , interfaceName , suffix )
177
+ type %s%s%s interface {
178
+ ` , prefix , interfaceName , suffix )
165
179
for _ , method := range methods {
166
180
interfaceType += fmt .Sprintf (` %s(ctx context.Context, req *%s.%sRequest) (*%s.%sResponse, error)
167
181
` , method , packageName , method , packageName , method )
@@ -171,15 +185,15 @@ type %s%s interface {
171
185
}
172
186
173
187
// 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 {
175
189
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) {
177
191
// Wrap Connect RPC client request
178
192
res, err := w.%s.%s(ctx, connect.NewRequest(req))
179
193
if res == nil {
180
194
return nil, err
181
195
}
182
196
return res.Msg, err
183
197
}
184
- ` , interfaceName , suffix , methodName , packageName , methodName , packageName , methodName , interfaceName , methodName )
198
+ ` , prefix , interfaceName , suffix , methodName , packageName , methodName , packageName , methodName , interfaceName , methodName )
185
199
}
0 commit comments