rshtml_core 0.5.0

RsHtml: A Template Engine for Seamless HTML and Rust Integration.
Documentation
use crate::error::E;
use crate::node::Node;
use crate::parser::{IParser, RsHtmlParser, Rule};
use crate::position::Position;
use pest::error::Error;
use pest::iterators::Pair;
use std::mem;
use std::path::PathBuf;

pub struct TemplateParser;

impl IParser for TemplateParser {
    fn parse(parser: &mut RsHtmlParser, pair: Pair<Rule>) -> Result<Node, Box<Error<Rule>>> {
        let span = pair.as_span();
        let position = Position::from(&pair);

        let file = parser
            .files
            .last()
            .ok_or_else(|| E::mes("No file found for component!").span(span))?;

        let component_path = PathBuf::from(file);
        let component_name = parser.extract_component_name(file).ok_or(
            E::mes(format!(
                "Failed to derive component name from import path: '{file:#?}'"
            ))
            .span(span),
        )?;

        let prev_fns = mem::take(&mut parser.fns);

        let body = parser.build_nodes_from_pairs(pair.into_inner())?;

        let fns = mem::replace(&mut parser.fns, prev_fns);

        Ok(Node::Template(
            component_path,
            component_name,
            fns,
            body,
            position,
        ))
    }
}