4 个版本
0.1.5 | 2021 年 2 月 22 日 |
---|---|
0.1.4 | 2020 年 12 月 24 日 |
0.1.3 | 2020 年 9 月 9 日 |
#1247 在 编码
52KB
996 行
tfschema-bindgen
该软件包旨在将从中提取的 Terraform 提供者模式编译成 Serde 类型定义。
快速入门
生成负责反序列化和序列化的 Rust 类型需要 Terraform 模式。它可以是从您的 Terraform 配置中导出的,也可以是手动生成的。我们将采用后者,因此定义一个包含一个提供者类型和一个属性的参考模式
{
"provider_schemas": {
"test_provider": {
"provider": {
"version": 0,
"block": {
"attributes": {
"base_url": {
"type": "string",
"description": "The url.",
"optional": true
}
}
}
}
}
},
"format_version": "0.1"
}
除了 Rust 库之外,此软件包还提供二进制工具 tfbindgen
,用于处理磁盘上保存的 Terraform 模式。在此存储库之外,您可以使用以下命令安装此工具
cargo install tfschema-bindgen
然后使用 $HOME/.cargo/bin/tfbindgen
。
我们将假设我们位于存储库内部来使用此工具。
以下命令将从前面的定义生成 Serde 绑定,并将它们输出到 test.rs
模块
cargo run --bin tfbindgen -- test.json > test.rs
以下是一个 Rust 示例片段,它包含前面生成的绑定,并在此基础上构建一个主函数,用于反序列化符合我们的 Terraform 模式的配置描述符
#![allow(unused_imports, non_snake_case, non_camel_case_types, non_upper_case_globals)]
use std::collections::BTreeMap as Map;
use serde::{Serialize, Deserialize};
use serde_bytes::ByteBuf as Bytes;
#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)]
pub struct config {
pub data: Option<Vec<datasource_root>>,
pub provider: Option<Vec<provider_root>>,
pub resource: Option<Vec<resource_root>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)]
pub enum datasource_root {
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)]
pub enum provider_root {
test_provider(Vec<test_provider_details>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)]
pub enum resource_root {
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)]
pub struct test_provider_details {
pub base_url: Option<String>,
}
const TF_JSON_CONFIG: &str = r#"{
"provider": [
{
"test_provider": [
{
"base_url": "https://acme.com/foo"
}
]
}
]
}"#;
fn main() -> Result<(), std::io::Error> {
let res: config = serde_json::from_str(TF_JSON_CONFIG).unwrap();
assert_eq!(res.provider.as_ref().map(|x| x.is_empty()), Some(false));
assert_eq!(
res.provider.as_ref().map(|x| x.get(0).is_none()),
Some(false)
);
let prv = res
.provider
.as_ref()
.and_then(|x| x.get(0))
.and_then(|x| match x {
provider_root::test_provider(p) => p.get(0),
});
assert_eq!(prv.is_none(), false);
assert_eq!(
prv.and_then(|x| x.base_url.to_owned()),
Some("https://acme.com/foo".to_owned())
);
print!("success!\n");
Ok(())
}
快速入门示例
除了 Rust 库和生成工具之外,此软件包还提供上述示例,可以使用以下命令执行
cargo run --example quickstart
使用第三方 Terraform 模式
为了操作第三方提供者的 Terraform 配置描述符,必须使用提供的 JSON 格式模式描述符生成 Rust 绑定。
首先,创建一个最小的 Terraform 配置来声明目标提供者。以下是一个启用 Amazon Web Services (AWS) Terraform 提供者的示例
provider "aws" {
version = ">= 2.31.0, < 3.0"
}
初始化 Terraform,以便配置的提供者在本地环境中安装
terraform init
其次,提取 Terraform 配置中定义的提供者的模式,本例中为 AWS
terraform providers schema -json > aws-provider-schema.json
最后,使用以下命令生成给定提供者的 Rust (反)序列化类型(假设您位于存储库内部)
cargo run --bin tfbindgen -- aws-provider-schema.json > aws_provider_schema.rs
为了序列化/反序列化提供者的配置,请在您的应用程序中导入生成的模块。
许可证
本项目可在以下许可证的条款下使用:Apache 2.0 许可证或MIT 许可证。
依赖项
~5.5MB
~99K SLoC