load("@bazel_skylib//rules:diff_test.bzl", "diff_test")
load("@rules_rust//rust:defs.bzl", "rust_library", "rust_binary", "rust_test", "rust_doc_test")
load("//bazel:proto_descriptor_set.bzl", "proto_descriptor_set")
exports_files([
"Cargo.toml",
"Cargo.lock",
".cargo/config.toml",
])
rust_library(
name = "protocrap",
srcs = glob(
["src/**/*.rs"],
exclude = ["src/main.rs", "src/codegen/**"],
),
crate_features = [
"std",
"serde_support",
],
edition = "2024",
visibility = ["//visibility:public"],
deps = [
"@crates//:allocator-api2",
"@crates//:base64",
"@crates//:futures",
"@crates//:serde",
"@crates//:time",
],
)
rust_binary(
name = "protocrap-codegen",
srcs = ["src/main.rs"] + glob(["src/codegen/*.rs"]),
crate_features = ["bazel"],
edition = "2024",
visibility = ["//visibility:public"],
deps = [
":protocrap",
"@crates//:allocator-api2",
"@crates//:anyhow",
"@crates//:prettyplease",
"@crates//:proc-macro2",
"@crates//:quote",
"@crates//:serde_json",
"@crates//:syn",
],
)
proto_descriptor_set(
name = "descriptor_set",
deps = [
"@protobuf//:descriptor_proto",
],
visibility = ["//visibility:public"],
)
rust_test(
name = "protocrap_test",
crate = ":protocrap",
crate_features = [
"std",
"serde_support",
],
)
genrule(
name = "generate_descriptor_test",
srcs = [":descriptor_set"],
outs = ["descriptor.pc.rs.generated"],
cmd = "$(location :protocrap-codegen) $(location :descriptor_set) $@",
tools = [":protocrap-codegen"],
)
diff_test(
name = "descriptor_up_to_date_test",
file1 = ":generate_descriptor_test",
file2 = "src/descriptor.pc.rs",
)
rust_binary(
name = "protocrap-codegen-bootstrap",
srcs = ["src/main.rs"] + glob(["src/codegen/*.rs"]),
aliases = {"@crates//:protocrap": "protocrap"},
crate_features = ["bazel"],
edition = "2024",
deps = [
"@crates//:allocator-api2",
"@crates//:anyhow",
"@crates//:prettyplease",
"@crates//:proc-macro2",
"@crates//:protocrap",
"@crates//:quote",
"@crates//:serde_json",
"@crates//:syn",
],
)
genrule(
name = "generate_descriptor_bootstrap",
srcs = [":descriptor_set"],
outs = ["descriptor.pc.rs.bootstrap"],
cmd = "$(location :protocrap-codegen-bootstrap) $(location :descriptor_set) $@",
tools = [":protocrap-codegen-bootstrap"],
)
diff_test(
name = "bootstrap_matches_test",
file1 = ":generate_descriptor_test",
file2 = ":generate_descriptor_bootstrap",
)
genrule(
name = "regen_descriptor",
srcs = [":generate_descriptor_bootstrap"],
outs = ["regen_descriptor_runner.sh"],
cmd = """
echo '#!/bin/bash' > $@
echo 'cp "$(location :generate_descriptor_bootstrap)" "$$BUILD_WORKSPACE_DIRECTORY/src/descriptor.pc.rs"' >> $@
chmod +x $@
""",
executable = True,
)
rust_doc_test(
name = "doc_test",
crate = ":protocrap",
)