#starlark #serialization #build-system #serde #bazel #buck

serde_starlark

Serde序列化器,用于生成Starlark构建目标

17个版本

0.1.16 2024年1月2日
0.1.15 2023年12月20日
0.1.14 2023年7月15日
0.1.12 2023年4月23日
0.0.0 2022年12月23日

#1659 in 编码

Download history 11406/week @ 2024-04-14 11415/week @ 2024-04-21 12677/week @ 2024-04-28 11605/week @ 2024-05-05 16623/week @ 2024-05-12 13580/week @ 2024-05-19 9933/week @ 2024-05-26 12682/week @ 2024-06-02 12103/week @ 2024-06-09 10910/week @ 2024-06-16 10999/week @ 2024-06-23 10483/week @ 2024-06-30 13726/week @ 2024-07-07 14107/week @ 2024-07-14 12047/week @ 2024-07-21 14214/week @ 2024-07-28

54,973 个月下载量
用于 2 crates

MIT/Apache

66KB
1.5K SLoC

serde_starlark

github crates.io docs.rs build status

Serde序列化器,用于生成有效的Starlark,这是一种声明性格式,用于在包括Bazel、Buck、Pants和Please等构建系统中描述构建目标。


示例

以下示例将syn crate的最小Bazel目标进行序列化。

该仓库中的tests/bazel.rs测试有一个更详细的示例,包括诸如load()package(default_visibility =)、对glob()的独立includeexclude参数以及select({})等内容。

#[derive(Serialize)]
#[serde(rename = "rust_library")]
pub struct RustLibrary {
    pub name: String,
    pub srcs: Glob,
    pub crate_features: BTreeSet<String>,
    pub edition: u16,
    pub deps: BTreeSet<String>,
}

#[derive(Serialize)]
#[serde(rename = "glob")]
pub struct Glob(pub BTreeSet<String>);

fn main() {
    let rust_library = RustLibrary { ... };

    print!("{}", serde_starlark::to_string(&rust_library).unwrap());
}
rust_library(
    name = "syn",
    srcs = glob(["**/*.rs"]),
    crate_features = [
        "default",
        "full",
    ],
    edition = 2018,
    deps = [
        ":proc-macro2",
        ":quote",
        ":unicode-ident",
    ],
)

数据模型

原始类型(整数、布尔值、字符串)以明显的方式序列化为Starlark。

Serde序列化序列序列化为Starlark数组。Serde映射序列化为Starlark映射。

具有命名字段的Rust结构体序列化为具有命名参数的Starlark "函数调用"。

#[derive(Serialize)]
#[serde(rename = "rust_library")]
pub struct RustLibrary {
    pub name: String,
    pub edition: u16,
}
rust_library(
    name = "syn",
    edition = 2018,
)

Rust新类型结构体和元组结构体序列化为具有位置参数的Starlark "函数调用"。

#[derive(Serialize)]
#[serde(rename = "select")]
pub struct Select<T>(pub BTreeMap<String, T>);
select({
    "//conditions:default": [],
})

要使新类型结构体不显示为函数调用,请使用serde(transparent)属性。

#[derive(Serialize)]
#[serde(transparent)]
pub struct Dependency(pub String);

类型为 Option<T> 的字段序列化时可以表示为 None 或存在时的值。建议使用 serde(skip_serializing_if = "Option::is_none") 来省略序列化输出中的值为 None 的字段。


许可证

根据您的选择,可在 Apache License, Version 2.0MIT 许可证 下使用。
除非您明确声明,否则您提交的任何有意包含在此软件包中的贡献,如 Apache-2.0 许可证中定义的,应按上述方式双许可,不附加任何额外条款或条件。

依赖项

~110–345KB