#terraform #deserialize #serialization #infrastructure #serde #data-structures

bin+lib tfschema-bindgen

为 Terraform Schema 生成 (反)序列化 Rust 代码

4 个版本

0.1.5 2021 年 2 月 22 日
0.1.4 2020 年 12 月 24 日
0.1.3 2020 年 9 月 9 日

#1247编码

MIT/Apache

52KB
996

tfschema-bindgen

Build Status tfschena-bindgen on crates.io Documentation (latest release) License License

该软件包旨在将从中提取的 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