Serde serializer for generating syntactically valid Starlark, the declarative format used for describing build targets in build systems including [Bazel], [Buck], [Pants], and [Please].
The following example serializes a minimal Bazel target for the syn
crate.
The tests/bazel.rs test in this repo has a somewhat more fleshed out example
of this use case, including things like load(…)
, package(default_visibility =
…)
, distinct include
and exclude
arguments to glob(…)
, and select({…})
.
```rust
pub struct RustLibrary {
pub name: String,
pub srcs: Glob,
pub crate_features: BTreeSet
pub struct Glob(pub BTreeSet
fn main() { let rust_library = RustLibrary { ... };
print!("{}", serde_starlark::to_string(&rust_library).unwrap());
} ```
bzl
rust_library(
name = "syn",
srcs = glob(["**/*.rs"]),
crate_features = [
"default",
"full",
],
edition = 2018,
deps = [
":proc-macro2",
":quote",
":unicode-ident",
],
)
The primitive types (integers, boolean, string) serialize in the obvious way to Starlark.
Serde sequences serialize to Starlark arrays. Serde maps serialize to Starlark maps.
Rust structs with named fields serialize to Starlark "function calls" with named arguments:
```rust
pub struct RustLibrary { pub name: String, pub edition: u16, } ```
bzl
rust_library(
name = "syn",
edition = 2018,
)
Rust newtype structs and tuple structs serialize to Starlark "function calls" with positional arguments:
```rust
pub struct Select
bzl
select({
"//conditions:default": [],
})
To make a newtype struct which does not appear as a function call, use the
serde(transparent)
attribute.
```rust
pub struct Dependency(pub String); ```
Fields of type Option<T>
serialize as either None
or the value if present.
Consider using serde(skip_serializing_if = "Option::is_none")
to omit fields
with value None
from the serialized output.
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.