Skip to content

Commit 2944151

Browse files
authored
chore: add structured options (#28)
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
1 parent 7ecda53 commit 2944151

File tree

1 file changed

+37
-20
lines changed

1 file changed

+37
-20
lines changed

cmd/protoc-gen-elixir-grpc/main.go

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ const (
6060
usage = "\n\nFlags:\n -h, --help\tPrint this help and exit.\n --version\tPrint the version and exit.\n --handler_module_prefix\tCustom Elixir module prefix for handler modules instead of protobuf package.\n --http_transcode\tEnable HTTP transcoding support (adds http_transcode: true to use GRPC.Server).\n --codecs\tComma-separated list of codec modules (e.g., 'GRPC.Codec.Proto,GRPC.Codec.WebText,GRPC.Codec.JSON').\n --compressors\tComma-separated list of compressor modules (e.g., 'GRPC.Compressor.Gzip')."
6161
)
6262

63+
// GenerateOptions contains configuration options for generating Elixir gRPC files
64+
type GenerateOptions struct {
65+
PackagePrefix string
66+
HandlerModulePrefix string
67+
HTTPTranscode bool
68+
Codecs []string
69+
Compressors []string
70+
}
71+
6372
func parsePluginParameters(paramStr string, flagSet *flag.FlagSet) error {
6473
if paramStr == "" {
6574
return nil
@@ -222,6 +231,14 @@ func main() {
222231
codecsList := parseCodecs(*codecs)
223232
compressorsList := parseCodecs(*compressors)
224233

234+
opts := GenerateOptions{
235+
PackagePrefix: *packagePrefix,
236+
HandlerModulePrefix: *handlerModulePrefix,
237+
HTTPTranscode: *httpTranscode,
238+
Codecs: codecsList,
239+
Compressors: compressorsList,
240+
}
241+
225242
for _, fileName := range req.FileToGenerate {
226243
var protoFile *descriptorpb.FileDescriptorProto
227244
for _, file := range req.ProtoFile {
@@ -238,7 +255,7 @@ func main() {
238255
continue
239256
}
240257

241-
generateElixirFile(resp, protoFile, *packagePrefix, *handlerModulePrefix, *httpTranscode, codecsList, compressorsList)
258+
generateElixirFile(resp, protoFile, opts)
242259
}
243260

244261
output, err := proto.Marshal(resp)
@@ -253,12 +270,12 @@ func main() {
253270
}
254271
}
255272

256-
func generateElixirFile(resp *pluginpb.CodeGeneratorResponse, file *descriptorpb.FileDescriptorProto, packagePrefix, handlerModulePrefix string, httpTranscode bool, codecs []string, compressors []string) {
273+
func generateElixirFile(resp *pluginpb.CodeGeneratorResponse, file *descriptorpb.FileDescriptorProto, opts GenerateOptions) {
257274
if len(file.Service) == 0 {
258275
return
259276
}
260277

261-
fileName := generateFilePath(file, packagePrefix)
278+
fileName := generateFilePath(file, opts)
262279

263280
var content strings.Builder
264281
content.WriteString("# Code generated by protoc-gen-elixir-grpc. DO NOT EDIT.\n")
@@ -267,7 +284,7 @@ func generateElixirFile(resp *pluginpb.CodeGeneratorResponse, file *descriptorpb
267284
content.WriteString("\n")
268285

269286
for _, service := range file.Service {
270-
generateServiceModule(&content, file, service, handlerModulePrefix, httpTranscode, codecs, compressors)
287+
generateServiceModule(&content, file, service, opts)
271288
content.WriteString("\n")
272289
}
273290

@@ -277,29 +294,29 @@ func generateElixirFile(resp *pluginpb.CodeGeneratorResponse, file *descriptorpb
277294
})
278295
}
279296

280-
func generateServiceModule(content *strings.Builder, file *descriptorpb.FileDescriptorProto, service *descriptorpb.ServiceDescriptorProto, handlerModulePrefix string, httpTranscode bool, codecs []string, compressors []string) {
297+
func generateServiceModule(content *strings.Builder, file *descriptorpb.FileDescriptorProto, service *descriptorpb.ServiceDescriptorProto, opts GenerateOptions) {
281298
serverModuleName := generateServerModuleName(file, service)
282299
serviceModuleName := generateServiceModuleName(file, service)
283300

284301
content.WriteString("defmodule " + serverModuleName + " do\n")
285302
content.WriteString(" use GRPC.Server,\n")
286303
content.WriteString(" service: " + serviceModuleName)
287-
if httpTranscode {
304+
if opts.HTTPTranscode {
288305
content.WriteString(",\n http_transcode: true")
289306
}
290-
if len(codecs) > 0 {
307+
if len(opts.Codecs) > 0 {
291308
content.WriteString(",\n codecs: [")
292-
for i, codec := range codecs {
309+
for i, codec := range opts.Codecs {
293310
if i > 0 {
294311
content.WriteString(", ")
295312
}
296313
content.WriteString(codec)
297314
}
298315
content.WriteString("]")
299316
}
300-
if len(compressors) > 0 {
317+
if len(opts.Compressors) > 0 {
301318
content.WriteString(",\n compressors: [")
302-
for i, compressor := range compressors {
319+
for i, compressor := range opts.Compressors {
303320
if i > 0 {
304321
content.WriteString(", ")
305322
}
@@ -310,15 +327,15 @@ func generateServiceModule(content *strings.Builder, file *descriptorpb.FileDesc
310327
content.WriteString("\n\n")
311328

312329
for _, method := range service.Method {
313-
generateMethodDelegate(content, file, service, method, handlerModulePrefix)
330+
generateMethodDelegate(content, file, service, method, opts)
314331
}
315332

316333
content.WriteString("end")
317334
}
318335

319-
func generateMethodDelegate(content *strings.Builder, file *descriptorpb.FileDescriptorProto, service *descriptorpb.ServiceDescriptorProto, method *descriptorpb.MethodDescriptorProto, handlerModulePrefix string) {
336+
func generateMethodDelegate(content *strings.Builder, file *descriptorpb.FileDescriptorProto, service *descriptorpb.ServiceDescriptorProto, method *descriptorpb.MethodDescriptorProto, opts GenerateOptions) {
320337
methodName := toSnakeCase(method.GetName())
321-
handlerModuleName := generateHandlerModuleName(file, service, method, handlerModulePrefix)
338+
handlerModuleName := generateHandlerModuleName(file, service, method, opts)
322339

323340
isStreamingClient := method.GetClientStreaming()
324341
isStreamingServer := method.GetServerStreaming()
@@ -376,14 +393,14 @@ func generateServerModuleName(file *descriptorpb.FileDescriptorProto, service *d
376393
return strings.Join(elixirParts, ".")
377394
}
378395

379-
func generateHandlerModuleName(file *descriptorpb.FileDescriptorProto, service *descriptorpb.ServiceDescriptorProto, method *descriptorpb.MethodDescriptorProto, handlerModulePrefix string) string {
396+
func generateHandlerModuleName(file *descriptorpb.FileDescriptorProto, service *descriptorpb.ServiceDescriptorProto, method *descriptorpb.MethodDescriptorProto, opts GenerateOptions) string {
380397
serviceName := service.GetName()
381398
methodName := method.GetName()
382399
pkg := file.GetPackage()
383400

384-
if handlerModulePrefix != "" {
401+
if opts.HandlerModulePrefix != "" {
385402
if pkg == "" {
386-
return fmt.Sprintf("%s.%s.Server.%sHandler", handlerModulePrefix, toPascalCase(serviceName), toPascalCase(methodName))
403+
return fmt.Sprintf("%s.%s.Server.%sHandler", opts.HandlerModulePrefix, toPascalCase(serviceName), toPascalCase(methodName))
387404
}
388405

389406
parts := strings.Split(pkg, ".")
@@ -392,7 +409,7 @@ func generateHandlerModuleName(file *descriptorpb.FileDescriptorProto, service *
392409
packageParts = append(packageParts, toPascalCase(part))
393410
}
394411

395-
return fmt.Sprintf("%s.%s.%s.Server.%sHandler", handlerModulePrefix, strings.Join(packageParts, "."), toPascalCase(serviceName), toPascalCase(methodName))
412+
return fmt.Sprintf("%s.%s.%s.Server.%sHandler", opts.HandlerModulePrefix, strings.Join(packageParts, "."), toPascalCase(serviceName), toPascalCase(methodName))
396413
}
397414

398415
if pkg == "" {
@@ -410,14 +427,14 @@ func generateHandlerModuleName(file *descriptorpb.FileDescriptorProto, service *
410427
return strings.Join(elixirParts, ".")
411428
}
412429

413-
func generateFilePath(file *descriptorpb.FileDescriptorProto, packagePrefix string) string {
430+
func generateFilePath(file *descriptorpb.FileDescriptorProto, opts GenerateOptions) string {
414431
pkg := file.GetPackage()
415432
fileName := file.GetName()
416433

417434
var pathParts []string
418435

419-
if packagePrefix != "" {
420-
pathParts = append(pathParts, packagePrefix)
436+
if opts.PackagePrefix != "" {
437+
pathParts = append(pathParts, opts.PackagePrefix)
421438
}
422439

423440
if pkg != "" {

0 commit comments

Comments
 (0)