use crate::*;
#[derive(Debug)]
pub(crate) enum TextPart {
Literal(String),
Expression(String),
}
impl TextPart {
pub(crate) fn parse(mut s: &str, args: &Args) -> Vec<TextPart> {
let mut parts = Vec::new();
while let Some(text) = get_all_before_strict(s, &args.config.variable_bounds.0) {
s = &s[text.len() + args.config.variable_bounds.0.len()..];
if !text.is_empty() {
parts.push(TextPart::Literal(text.to_string()));
}
if s.is_empty() {
break;
}
let var = match get_all_before_strict(s, &args.config.variable_bounds.1) {
Some(var) => var,
None => abort!(args.path_span, "Missing closing variable separator in html text"),
};
s = &s[var.len() + args.config.variable_bounds.1.len()..];
parts.push(TextPart::Expression(var.to_string()));
}
if !s.is_empty() {
parts.push(TextPart::Literal(s.to_string()));
}
parts
}
pub(crate) fn to_code(&self, opts: &mut Vec<String>, iters: &mut Vec<String>, args: &Args) -> String {
text_part_to_code(self, opts, iters, args)
}
}
pub(crate) trait HackTraitVecTextPart {
fn to_code(&self, opts: &mut Vec<String>, iters: &mut Vec<String>, args: &Args) -> String;
}
impl HackTraitVecTextPart for Vec<TextPart> {
fn to_code(&self, opts: &mut Vec<String>, iters: &mut Vec<String>, args: &Args) -> String {
self.iter().map(|p| p.to_code(opts, iters, args)).collect::<Vec<_>>().join("")
}
}