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::node::SectionDirectiveContent;
use crate::parser::{IParser, RsHtmlParser, Rule};
use crate::position::Position;
use crate::str_extensions::*;
use pest::error::Error;
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 position = Position::from(&pair);

        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, position))
            }
            _ => Err(E::mes("Error: section_directive").span(pair_span)),
        }
    }
}