xref: /aosp_15_r20/external/bazelbuild-rules_go/docs/doc_helpers.bzl (revision 9bb1b549b6a84214c53be0924760be030e66b93a)
1*9bb1b549SSpandan Dasload("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
2*9bb1b549SSpandan Dasload("@bazel_skylib//rules:write_file.bzl", "write_file")
3*9bb1b549SSpandan Dasload("@bazel_skylib//rules:diff_test.bzl", "diff_test")
4*9bb1b549SSpandan Das
5*9bb1b549SSpandan Dasdef stardoc_with_diff_test(
6*9bb1b549SSpandan Das        bzl_library_target,
7*9bb1b549SSpandan Das        out_label,
8*9bb1b549SSpandan Das        rule_template = "@io_bazel_stardoc//stardoc:templates/markdown_tables/rule.vm"):
9*9bb1b549SSpandan Das    """Creates a stardoc target coupled with a diff_test for a given bzl_library.
10*9bb1b549SSpandan Das
11*9bb1b549SSpandan Das    This is helpful for minimizing boilerplate when lots of stardoc targets are to be generated.
12*9bb1b549SSpandan Das
13*9bb1b549SSpandan Das    Args:
14*9bb1b549SSpandan Das        bzl_library_target: the label of the bzl_library target to generate documentation for
15*9bb1b549SSpandan Das        out_label: the label of the output MD file
16*9bb1b549SSpandan Das        rule_template: the label or path to the Velocity rule template to use with stardoc
17*9bb1b549SSpandan Das    """
18*9bb1b549SSpandan Das
19*9bb1b549SSpandan Das    out_file = out_label.replace("//", "").replace(":", "/")
20*9bb1b549SSpandan Das
21*9bb1b549SSpandan Das    # Generate MD from .bzl
22*9bb1b549SSpandan Das    stardoc(
23*9bb1b549SSpandan Das        name = out_file.replace("/", "_").replace(".md", "-docgen"),
24*9bb1b549SSpandan Das        out = out_file.replace(".md", "-docgen.md"),
25*9bb1b549SSpandan Das        input = bzl_library_target + ".bzl",
26*9bb1b549SSpandan Das        rule_template = rule_template,
27*9bb1b549SSpandan Das        deps = [bzl_library_target],
28*9bb1b549SSpandan Das    )
29*9bb1b549SSpandan Das
30*9bb1b549SSpandan Das    # Ensure that the generated MD has been updated in the local source tree
31*9bb1b549SSpandan Das    diff_test(
32*9bb1b549SSpandan Das        name = out_file.replace("/", "_").replace(".md", "-difftest"),
33*9bb1b549SSpandan Das        failure_message = "Please run \"bazel run //docs:update\"",
34*9bb1b549SSpandan Das        # Source file
35*9bb1b549SSpandan Das        file1 = out_label,
36*9bb1b549SSpandan Das        # Output from stardoc rule above
37*9bb1b549SSpandan Das        file2 = out_file.replace(".md", "-docgen.md"),
38*9bb1b549SSpandan Das    )
39*9bb1b549SSpandan Das
40*9bb1b549SSpandan Dasdef update_docs(
41*9bb1b549SSpandan Das        name = "update",
42*9bb1b549SSpandan Das        docs_folder = "docs"):
43*9bb1b549SSpandan Das    """Creates a sh_binary target which copies over generated doc files to the local source tree.
44*9bb1b549SSpandan Das
45*9bb1b549SSpandan Das    This is to be used in tandem with `stardoc_with_diff_test()` to produce a convenient workflow
46*9bb1b549SSpandan Das    for generating, testing, and updating all doc files as follows:
47*9bb1b549SSpandan Das
48*9bb1b549SSpandan Das    ``` bash
49*9bb1b549SSpandan Das    bazel build //{docs_folder}/... && bazel test //{docs_folder}/... && bazel run //{docs_folder}:update
50*9bb1b549SSpandan Das    ```
51*9bb1b549SSpandan Das
52*9bb1b549SSpandan Das    eg.
53*9bb1b549SSpandan Das
54*9bb1b549SSpandan Das    ``` bash
55*9bb1b549SSpandan Das    bazel build //docs/... && bazel test //docs/... && bazel run //docs:update
56*9bb1b549SSpandan Das    ```
57*9bb1b549SSpandan Das
58*9bb1b549SSpandan Das    Args:
59*9bb1b549SSpandan Das        name: the name of the sh_binary target
60*9bb1b549SSpandan Das        docs_folder: the name of the folder containing the doc files in the local source tree
61*9bb1b549SSpandan Das    """
62*9bb1b549SSpandan Das    content = ["#!/usr/bin/env bash", "cd ${BUILD_WORKSPACE_DIRECTORY}"]
63*9bb1b549SSpandan Das    data = []
64*9bb1b549SSpandan Das    for r in native.existing_rules().values():
65*9bb1b549SSpandan Das        if r["kind"] == "stardoc":
66*9bb1b549SSpandan Das            doc_gen = r["out"]
67*9bb1b549SSpandan Das            if doc_gen.startswith(":"):
68*9bb1b549SSpandan Das                doc_gen = doc_gen[1:]
69*9bb1b549SSpandan Das            doc_dest = doc_gen.replace("-docgen.md", ".md")
70*9bb1b549SSpandan Das            data.append(doc_gen)
71*9bb1b549SSpandan Das            content.append("cp -fv bazel-bin/{0}/{1} {2}".format(docs_folder, doc_gen, doc_dest))
72*9bb1b549SSpandan Das
73*9bb1b549SSpandan Das    update_script = name + ".sh"
74*9bb1b549SSpandan Das    write_file(
75*9bb1b549SSpandan Das        name = "gen_" + name,
76*9bb1b549SSpandan Das        out = update_script,
77*9bb1b549SSpandan Das        content = content,
78*9bb1b549SSpandan Das    )
79*9bb1b549SSpandan Das
80*9bb1b549SSpandan Das    native.sh_binary(
81*9bb1b549SSpandan Das        name = name,
82*9bb1b549SSpandan Das        srcs = [update_script],
83*9bb1b549SSpandan Das        data = data,
84*9bb1b549SSpandan Das    )
85