rshtml_core 0.1.0

RsHtml: A Template Engine for Seamless HTML and Rust Integration.
Documentation
use crate::Node;
use crate::node::SectionDirectiveContent;
use crate::parser::{IParser, RsHtmlParser, Rule};
use crate::traits::IsEscaped;
use pest::error::{Error, ErrorVariant};
use pest::iterators::Pair;

pub struct SectionDirectiveParser;

impl IParser for SectionDirectiveParser {
    fn parse(_: &mut RsHtmlParser, pair: Pair<Rule>) -> Result<Node, Box<Error<Rule>>> {
        let pair_span = pair.as_span();
        let mut pairs = pair
            .clone()
            .into_inner()
            .filter(|p| p.as_rule() == Rule::string_line || p.as_rule() == Rule::rust_expr_simple);

        match (pairs.next(), pairs.next()) {
            (Some(name), Some(value)) => {
                let value_pair = match value.as_rule() {
                    Rule::string_line => {
                        let value = value.as_str().trim_matches('"').trim_matches('\'').to_string();
                        SectionDirectiveContent::Text(value)
                    }
                    Rule::rust_expr_simple => {
                        let value = value.as_str();
                        SectionDirectiveContent::RustExprSimple(value.escaped_or_raw(), value.is_escaped())
                    }
                    _ => unreachable!(),
                };

                let name = name.as_str().trim_matches('"').trim_matches('\'').to_string();

                Ok(Node::SectionDirective(name, value_pair))
            }
            _ => Err(Box::new(Error::new_from_span(
                ErrorVariant::CustomError {
                    message: "Error: section_directive".to_string(),
                },
                pair_span,
            ))),
        }
    }
}