use crate::*;
use vize_carton::String;
pub(super) fn get_slot_props(dir: &DirectiveNode<'_>) -> Option<vize_carton::String> {
dir.exp.as_ref().map(|exp| match exp {
ExpressionNode::Simple(s) => s.loc.source.clone(),
ExpressionNode::Compound(c) => c.loc.source.clone(),
})
}
pub(super) fn prefix_slot_defaults(source: &str) -> String {
let bytes = source.as_bytes();
let len = bytes.len();
let mut result = String::with_capacity(len + 20);
let mut i = 0;
while i < len {
if bytes[i] == b'=' {
if i + 1 < len && (bytes[i + 1] == b'=' || bytes[i + 1] == b'>') {
result.push(bytes[i] as char);
result.push(bytes[i + 1] as char);
i += 2;
continue;
}
result.push('=');
i += 1;
while i < len && (bytes[i] == b' ' || bytes[i] == b'\t') {
result.push(bytes[i] as char);
i += 1;
}
if i < len && (bytes[i].is_ascii_alphabetic() || bytes[i] == b'_' || bytes[i] == b'$') {
let start = i;
while i < len
&& (bytes[i].is_ascii_alphanumeric() || bytes[i] == b'_' || bytes[i] == b'$')
{
i += 1;
}
let ident = &source[start..i];
if !matches!(
ident,
"true" | "false" | "null" | "undefined" | "NaN" | "Infinity"
) {
result.push_str("_ctx.");
}
result.push_str(ident);
}
} else {
result.push(bytes[i] as char);
i += 1;
}
}
result
}
pub(super) fn extract_slot_params(props_str: &str) -> Vec<String> {
let mut params = Vec::new();
super::super::v_for::extract_destructure_params(props_str.trim(), &mut params);
params
}