load("@bazel_skylib//lib:paths.bzl", "paths")

def _py_proto_library_impl(ctx):
    basename = ctx.file.src.basename
    outs = [
        ctx.actions.declare_file(paths.replace_extension(basename, "_pb2.py")),
        ctx.actions.declare_file(paths.replace_extension(basename, "_pb2.pyi")),
    ]
    ctx.actions.run(
        outputs = outs,
        inputs = [ctx.file.src],
        executable = ctx.executable.protoc_wrapper,
        arguments = [
            ctx.executable.protoc.path,
            ctx.executable.mypy_protobuf.path,
            ctx.file.src.path,
            paths.dirname(outs[0].path),
        ],
        tools = [
            ctx.executable.protoc,
            ctx.executable.mypy_protobuf,
        ],
        use_default_shell_env = True,
    )
    return [
        DefaultInfo(files = depset(direct = outs), data_runfiles = ctx.runfiles(files = outs)),
    ]

py_proto_library_typed = rule(
    implementation = _py_proto_library_impl,
    attrs = {
        "src": attr.label(allow_single_file = [".proto"]),
        "protoc_wrapper": attr.label(
            executable = True,
            cfg = "exec",
            default = Label("//pylib/tools:protoc_wrapper"),
        ),
        "protoc": attr.label(
            executable = True,
            cfg = "host",
            allow_files = True,
            default = Label("@com_google_protobuf//:protoc"),
        ),
        "mypy_protobuf": attr.label(
            executable = True,
            cfg = "exec",
            default = Label("//pylib/tools:protoc-gen-mypy"),
        ),
    },
)
