use std::rc::Rc;
use crate::ast::TemplateAst;
use crate::compile::ast_stack::TmplAstStack;
use crate::config::TemplateConfig;
use crate::err::TmplResult;
use crate::expr::common::ExpressionIR::ItemValue;
use crate::utils::str::Block;
use crate::value::TmplValue;
pub mod ast_stack;
pub struct Compile {
config: Rc<TemplateConfig>,
}
impl Compile {
pub(crate) fn new(config: Rc<TemplateConfig>) -> Self {
Compile { config }
}
pub fn build_template(&self, src: &str) -> TmplResult<Vec<TemplateAst>> {
let mut stack = TmplAstStack::default();
let block_arr = Block::new_group(
src,
&self.config.block_symbol.0,
&self.config.block_symbol.1,
&vec![("'", "'"), ("\"", "\"")],
);
for src_block in block_arr.iter() {
if let Block::Dynamic(src) = *src_block {
if let Some(_branch) = stack.get_stack_top_operator(&self.config.operators)? {
} else {
if let Some(operator) = self.config.get_operator_by_start(src) {
operator.check_scope(&stack)?;
stack.add_node(operator.build_ast(src)?)?;
} else {
stack.add_node(TemplateAst::ItemExpr(ItemValue(TmplValue::Text(
src.to_string(),
))))?;
}
}
} else if let Block::Static(text) = *src_block {
stack.add_node(TemplateAst::new_text(text))?;
}
}
println!("{:#?}", stack.root);
println!("{:#?}", stack.child_stack);
Ok(stack.root)
}
}