use anyhow::Result;
use serde_json::Value;
pub fn process_conditional_blocks(content: &str, variables: &Value) -> Result<String> {
let mut result = content.to_string();
if let Some(cloud_provider) = variables.get("cloud_provider").and_then(|p| p.as_str()) {
let providers = ["aws", "gcp", "azure", "vercel", "netlify"];
for provider in providers {
process_conditional_for_variable(&mut result, "cloud_provider", provider, cloud_provider);
}
}
Ok(result)
}
fn process_conditional_for_variable(content: &mut String, variable_name: &str, value: &str, selected_value: &str) {
let start_tag = format!("{{{{#if (eq {} \"{}\")}}}}}", variable_name, value);
let end_tag = "{{/if}}";
let mut start_idx = 0;
while let Some(block_start) = content[start_idx..].find(&start_tag) {
let block_start = start_idx + block_start;
if let Some(block_end) = content[block_start..].find(end_tag) {
let block_end = block_start + block_end + end_tag.len();
if value == selected_value {
let content_start = block_start + start_tag.len();
let content_end = block_end - end_tag.len();
let new_content = format!(
"{}{}{}",
&content[0..block_start],
&content[content_start..content_end],
&content[block_end..]
);
*content = new_content;
start_idx = block_start + (content_end - content_start);
} else {
let new_content = format!(
"{}{}",
&content[0..block_start],
&content[block_end..]
);
*content = new_content;
start_idx = block_start;
}
} else {
break;
}
}
}