mod branch;
mod generate;
use crate::ast::{IfBranchNode, IfNode, PropNode, RuntimeHelper};
use super::{context::CodegenContext, expression::generate_expression, helpers::escape_js_string};
use branch::generate_if_branch;
use vize_carton::ToCompactString;
pub fn generate_if(ctx: &mut CodegenContext, if_node: &IfNode<'_>) {
ctx.use_helper(RuntimeHelper::OpenBlock);
ctx.use_helper(RuntimeHelper::CreateComment);
for (i, branch) in if_node.branches.iter().enumerate() {
let branch_key = ctx.next_v_if_branch_key();
if let Some(condition) = &branch.condition {
if i == 0 {
ctx.push("(");
generate_expression(ctx, condition);
ctx.push(")");
ctx.indent();
ctx.newline();
ctx.push("? ");
} else {
ctx.newline();
ctx.push(": (");
generate_expression(ctx, condition);
ctx.push(")");
ctx.indent();
ctx.newline();
ctx.push("? ");
}
} else {
ctx.newline();
ctx.push(": ");
}
let saved_counter = ctx.v_if_branch_counter;
ctx.v_if_branch_counter = 0;
generate_if_branch(ctx, branch, branch_key);
ctx.v_if_branch_counter = saved_counter;
if branch.condition.is_some() && i > 0 {
ctx.deindent();
}
}
if if_node.branches.iter().all(|b| b.condition.is_some()) {
ctx.newline();
ctx.push(": ");
ctx.push(ctx.helper(RuntimeHelper::CreateComment));
ctx.push("(\"v-if\", true)");
}
ctx.deindent();
}
pub fn generate_if_branch_key(
ctx: &mut CodegenContext,
branch: &IfBranchNode<'_>,
branch_index: usize,
) {
if let Some(ref user_key) = branch.user_key {
match user_key {
PropNode::Attribute(attr) => {
if let Some(ref value) = attr.value {
ctx.push("\"");
ctx.push(&escape_js_string(value.content.as_str()));
ctx.push("\"");
} else {
ctx.push(&branch_index.to_compact_string());
}
}
PropNode::Directive(dir) => {
if let Some(ref exp) = dir.exp {
generate_expression(ctx, exp);
} else {
ctx.push(&branch_index.to_compact_string());
}
}
}
} else {
ctx.push(&branch_index.to_compact_string());
}
}