rshtml_core 0.3.0

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

pub struct ExtendsDirectiveParser;

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

        let mut path_str = parser.config.layout.clone();
        if let Some(path_pair) = pair.into_inner().find(|p| p.as_rule() == Rule::string_line) {
            path_str = path_pair
                .as_str()
                .trim_matches('"')
                .trim_matches('\'')
                .to_string();
        }

        let layout_node = match parser.parse_template(&path_str) {
            Ok(node) => node,
            Err(err) => {
                return Err(
                    E::mes(format!("Error parsing layout file '{path_str}': {err}"))
                        .span(pair_span),
                );
            }
        };

        let layout_node = match layout_node {
            Node::Template(file, nodes, _) => Node::Template(file, nodes, position),
            _ => {
                return Err(
                    E::mes("The layout file must contain Template as the top node.")
                        .span(pair_span),
                );
            }
        };

        Ok(Node::ExtendsDirective(
            PathBuf::from(path_str),
            Box::new(layout_node),
        ))
    }
}