use super::types::VizeMapping;
use vize_carton::append;
use vize_carton::String;
use vize_croquis::analysis::ComponentUsage;
pub(crate) fn generate_expression(
ts: &mut String,
mappings: &mut Vec<VizeMapping>,
expr: &vize_croquis::TemplateExpression,
template_offset: u32,
indent: &str,
) {
let src_start = (template_offset + expr.start) as usize;
let src_end = (template_offset + expr.end) as usize;
if let Some(ref guard) = expr.vif_guard {
append!(*ts, "{indent}if ({guard}) {{\n");
let gen_expr_start = ts.len();
append!(
*ts,
"{indent} void ({}); // {}\n",
expr.content,
expr.kind.as_str()
);
let gen_expr_end = ts.len();
mappings.push(VizeMapping {
gen_range: gen_expr_start..gen_expr_end,
src_range: src_start..src_end,
});
append!(
*ts,
"{indent} // @vize-map: expr -> {src_start}:{src_end}\n",
);
append!(*ts, "{indent}}}\n");
} else {
let gen_expr_start = ts.len();
append!(
*ts,
"{indent}void ({}); // {}\n",
expr.content,
expr.kind.as_str()
);
let gen_expr_end = ts.len();
mappings.push(VizeMapping {
gen_range: gen_expr_start..gen_expr_end,
src_range: src_start..src_end,
});
append!(*ts, "{indent}// @vize-map: expr -> {src_start}:{src_end}\n",);
}
}
pub(crate) fn generate_component_prop_checks(
ts: &mut String,
mappings: &mut Vec<VizeMapping>,
usage: &ComponentUsage,
idx: usize,
template_offset: u32,
indent: &str,
) {
let component_name = &usage.name;
for prop in &usage.props {
if prop.name.as_str() == "key" || prop.name.as_str() == "ref" {
continue;
}
if let Some(ref value) = prop.value {
if prop.is_dynamic {
let prop_src_start = (template_offset + prop.start) as usize;
let prop_src_end = (template_offset + prop.end) as usize;
append!(
*ts,
"{indent}// @vize-map: prop -> {prop_src_start}:{prop_src_end}\n",
);
let safe_prop_name = prop.name.replace('-', "_");
let gen_prop_start = ts.len();
append!(
*ts,
"{indent}({value}) as __{component_name}_{idx}_prop_{safe_prop_name};\n",
);
let gen_prop_end = ts.len();
mappings.push(VizeMapping {
gen_range: gen_prop_start..gen_prop_end,
src_range: prop_src_start..prop_src_end,
});
}
}
}
}