@@ -60,6 +60,15 @@ const (
6060 usage = "\n \n Flags:\n -h, --help\t Print this help and exit.\n --version\t Print the version and exit.\n --handler_module_prefix\t Custom Elixir module prefix for handler modules instead of protobuf package.\n --http_transcode\t Enable HTTP transcoding support (adds http_transcode: true to use GRPC.Server).\n --codecs\t Comma-separated list of codec modules (e.g., 'GRPC.Codec.Proto,GRPC.Codec.WebText,GRPC.Codec.JSON').\n --compressors\t Comma-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+
6372func 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