use serde_json::Value;
use std::process::Command;
use tf_bindgen_core::Stack;
const PATH: &str = "target/stacks/";
pub struct Terraform;
impl Terraform {
pub fn synth(stack: &Stack) -> std::io::Result<()> {
let document = stack.to_document();
let document = serde_json::to_value(&document).expect("valid JSON document");
let document = match document {
Value::Object(mut mapping) => {
let fields = vec!["data", "resource", "provider"];
for field in fields {
if let Some(Value::Object(fields)) = mapping.get(field) {
if fields.is_empty() {
mapping.remove(field);
}
}
}
Value::Object(mapping)
}
_ => unimplemented!(),
};
let document = serde_json::to_string_pretty(&document).unwrap();
let path = format!("{PATH}/{}", stack.name());
std::fs::create_dir_all(&path)?;
std::fs::write(format!("{path}/cdk.tf.json"), document)?;
Ok(())
}
pub fn init(stack: &Stack) -> std::io::Result<Command> {
Self::synth(stack)?;
let mut command = Command::new("terraform");
let path = format!("{PATH}/{}", stack.name());
command.arg(format!("-chdir={}", path));
command.arg("init");
Ok(command)
}
pub fn validate(stack: &Stack) -> std::io::Result<Command> {
Self::synth(stack)?;
let mut command = Command::new("terraform");
let path = format!("{PATH}/{}", stack.name());
command.arg(format!("-chdir={}", path));
command.arg("validate");
Ok(command)
}
pub fn apply(stack: &Stack) -> std::io::Result<Command> {
Self::synth(stack)?;
let mut command = Command::new("terraform");
let path = format!("{PATH}/{}", stack.name());
command.arg(format!("-chdir={}", path));
command.arg("apply");
Ok(command)
}
pub fn destroy(stack: &Stack) -> std::io::Result<Command> {
Self::synth(stack)?;
let mut command = Command::new("terraform");
let path = format!("{PATH}/{}", stack.name());
command.arg(format!("-chdir={}", path));
command.arg("destroy");
Ok(command)
}
pub fn plan(stack: &Stack) -> std::io::Result<Command> {
Self::synth(stack)?;
let mut command = Command::new("terraform");
let path = format!("{PATH}/{}", stack.name());
command.arg(format!("-chdir={}", path));
command.arg("plan");
Ok(command)
}
}