|  | load("@rules_proto//proto:defs.bzl", "ProtoInfo") | 
|  |  | 
|  | def _proto_docs(ctx): | 
|  | protos = [proto[ProtoInfo] for proto in ctx.attr.protos] | 
|  | transitive_sources = depset(transitive = [proto.transitive_sources for proto in protos]) | 
|  | transitive_proto_path = depset(transitive = [proto.transitive_proto_path for proto in protos]) | 
|  |  | 
|  | out = ctx.actions.declare_file(ctx.label.name + ".html") | 
|  |  | 
|  | args = [] | 
|  | args.append("--plugin") | 
|  | args.append(ctx.executable._protoc_gen_doc.path) | 
|  | args.append("--doc_out") | 
|  | args.append(out.dirname) | 
|  | args.append("--doc_opt=html," + out.basename) | 
|  |  | 
|  | for include_path in transitive_proto_path.to_list(): | 
|  | args.append("-I") | 
|  | args.append(include_path) | 
|  |  | 
|  | for src in transitive_sources.to_list(): | 
|  | # Due to the built-in import path for well-known types (see AddDefaultProtoPaths | 
|  | # in @com_google_protobuf//src/google/protobuf/compiler:command_line_interface.cc) | 
|  | # in protoc the Bazel-generated well-known protos are considered to contain | 
|  | #  "duplicate" types. | 
|  | # Since generating documentation for well-known types is not that useful just | 
|  | # skip them. | 
|  | if src.path.find("/bin/external/com_github_protocolbuffers_protobuf/_virtual_imports/") != -1: | 
|  | continue | 
|  | args.append(src.path) | 
|  |  | 
|  | ctx.actions.run( | 
|  | tools = [ctx.executable._protoc_gen_doc], | 
|  | inputs = transitive_sources, | 
|  | outputs = [out], | 
|  | executable = ctx.executable._protoc, | 
|  | arguments = args, | 
|  | ) | 
|  | return [DefaultInfo(files = depset([out]))] | 
|  |  | 
|  | proto_docs = rule( | 
|  | implementation = _proto_docs, | 
|  | doc = """ | 
|  | Generate a single HTML documentation file documenting all types and services from the transitive set of | 
|  | Protobuf files referenced by all proto_libraries passed into `protos`. | 
|  | """, | 
|  | attrs = { | 
|  | "protos": attr.label_list( | 
|  | doc = "A list of protobuf libraries for which (and their dependencies) documentation should be generated for", | 
|  | providers = [ProtoInfo], | 
|  | default = [], | 
|  | ), | 
|  | "_protoc": attr.label( | 
|  | default = Label("@com_google_protobuf//:protoc"), | 
|  | cfg = "exec", | 
|  | executable = True, | 
|  | allow_files = True, | 
|  | ), | 
|  | "_protoc_gen_doc": attr.label( | 
|  | default = Label("@com_github_pseudomuto_protoc_gen_doc//cmd/protoc-gen-doc"), | 
|  | cfg = "exec", | 
|  | executable = True, | 
|  | allow_files = True, | 
|  | ), | 
|  | }, | 
|  | ) |