76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
def _collect_includes(srcs):
|
|
includes = ["."]
|
|
for src in srcs:
|
|
include = src.dirname
|
|
if include and not include in includes:
|
|
includes += [include]
|
|
|
|
return includes
|
|
|
|
def _run_proto_gen_swagger(direct_proto_srcs, transitive_proto_srcs, actions, protoc, protoc_gen_swagger):
|
|
swagger_files = []
|
|
for proto in direct_proto_srcs:
|
|
swagger_file = actions.declare_file(
|
|
"%s.swagger.json" % proto.basename[:-len(".proto")],
|
|
sibling = proto,
|
|
)
|
|
|
|
args = actions.args()
|
|
args.add("--plugin=%s" % protoc_gen_swagger.path)
|
|
args.add("--swagger_out=logtostderr=true:%s" % swagger_file.dirname)
|
|
args.add("-Iexternal/com_google_protobuf/src")
|
|
args.add("-Iexternal/com_github_googleapis_googleapis")
|
|
args.add(["-I%s" % include for include in _collect_includes(direct_proto_srcs + transitive_proto_srcs)])
|
|
args.add(proto.basename)
|
|
|
|
actions.run(
|
|
executable = protoc,
|
|
inputs = direct_proto_srcs + transitive_proto_srcs + [protoc_gen_swagger],
|
|
outputs = [swagger_file],
|
|
arguments = [args],
|
|
)
|
|
|
|
swagger_files.append(swagger_file)
|
|
|
|
return swagger_files
|
|
|
|
def _proto_gen_swagger_impl(ctx):
|
|
proto = ctx.attr.proto.proto
|
|
|
|
return struct(
|
|
files=depset(
|
|
_run_proto_gen_swagger(
|
|
direct_proto_srcs = proto.direct_sources,
|
|
transitive_proto_srcs = ctx.files._well_known_protos + proto.transitive_sources.to_list(),
|
|
actions = ctx.actions,
|
|
protoc = ctx.executable._protoc,
|
|
protoc_gen_swagger = ctx.executable._protoc_gen_swagger,
|
|
)
|
|
)
|
|
)
|
|
|
|
protoc_gen_swagger = rule(
|
|
attrs = {
|
|
"proto": attr.label(
|
|
allow_rules = ["proto_library"],
|
|
mandatory = True,
|
|
providers = ['proto'],
|
|
),
|
|
"_protoc": attr.label(
|
|
default = "@com_google_protobuf//:protoc",
|
|
executable = True,
|
|
cfg = "host",
|
|
),
|
|
"_well_known_protos": attr.label(
|
|
default = "@com_google_protobuf//:well_known_protos",
|
|
allow_files = True,
|
|
),
|
|
"_protoc_gen_swagger": attr.label(
|
|
default = Label("@grpc_ecosystem_grpc_gateway//protoc-gen-swagger:protoc-gen-swagger"),
|
|
executable = True,
|
|
cfg = "host",
|
|
),
|
|
},
|
|
implementation = _proto_gen_swagger_impl,
|
|
)
|