From e0f04a63b89008c8425caebf7e6eb92b6ead8637 Mon Sep 17 00:00:00 2001 From: tan Date: Mon, 3 May 2021 10:32:17 +0530 Subject: [PATCH 1/2] allow additional include dirs during generation Allow additional include directories to be specified during code generation, which will be passed on to `protoc`. --- src/generate.jl | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/generate.jl b/src/generate.jl index 0a626f3..055afa0 100644 --- a/src/generate.jl +++ b/src/generate.jl @@ -127,7 +127,7 @@ Generate a gRPC client from protobuf specification file. - `outdir`: Directory to write generated code into, created if not present already. Existing files if any will be overwtitten. """ -function generate(proto::String; outdir::String=pwd()) +function generate(proto::String; outdir::String=pwd(), includes::Vector{String}=String[]) if !isfile(proto) throw(ArgumentError("No such file - $proto")) end @@ -138,14 +138,18 @@ function generate(proto::String; outdir::String=pwd()) # determine the package name and service name package, services = detect_services(proto) protodir = dirname(proto) - @info("Detected", package, services) + includeflag = `-I=$protodir` + for inc in includes + includeflag = `$includeflag -I=$inc` + end + @info("Detected", package, services, includes) # generate protobuf services mkpath(outdir) bindir = Sys.BINDIR pathenv = string(ENV["PATH"], Sys.iswindows() ? ";" : ":", bindir) withenv("PATH"=>pathenv) do - ProtoBuf.protoc(`-I=$protodir --julia_out=$outdir $proto`) + ProtoBuf.protoc(`$includeflag --julia_out=$outdir $proto`) end # include the generated code and detect service method names From 8d3cd75a03d766dea2ecb9aa591b7c3b892507c8 Mon Sep 17 00:00:00 2001 From: tan Date: Mon, 3 May 2021 14:54:36 +0530 Subject: [PATCH 2/2] handle `.` in package name --- src/generate.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/generate.jl b/src/generate.jl index 055afa0..e58d152 100644 --- a/src/generate.jl +++ b/src/generate.jl @@ -1,11 +1,11 @@ const package_regex = r"package\s(\S*)[\s]*;.*" const service_regex = r"service\s(\S*)[\s]*{.*" -function write_header(io, package, client_module_name) +function write_header(io, generated_module, package, client_module_name) print(io, """module $(client_module_name) using gRPCClient - include("$(package).jl") + include("$(generated_module).jl") using .$(package) import Base: show @@ -158,9 +158,9 @@ function generate(proto::String; outdir::String=pwd(), includes::Vector{String}= Main.eval(:(include($generated_module_file))) # generate the gRPC client code - client_module_name = string(titlecase(package; strict=false), "Clients") + client_module_name = string(titlecase(generated_module; strict=false), "Clients") open(joinpath(outdir, "$(client_module_name).jl"), "w") do grpcservice - write_header(grpcservice, package, client_module_name) + write_header(grpcservice, generated_module, package, client_module_name) for service in services methods = get_generated_method_table(string(package, "._", service, "_methods")) write_service(grpcservice, package, service, methods)