jens 0.6.0

Readable templates for code generation
Documentation
use crate::parser::{get_ident, Rule};
use pest::iterators::Pair;

#[derive(Debug, PartialEq)]
pub enum Segment {
    Content(String),
    Placeholder(String),
}

impl From<Pair<'_, Rule>> for Segment {
    fn from(pair: Pair<'_, Rule>) -> Self {
        match pair.as_rule() {
            Rule::escaped_dollar => Segment::Content("$".into()),
            Rule::not_placeholder => Segment::Content(pair.as_str().into()),
            Rule::placeholder => Segment::Placeholder(get_ident(pair)),
            _ => unreachable!(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::parser::parse;

    fn tmpl_line(content: &str) -> String {
        format!("main =\n    {}\n----", content)
    }

    #[test]
    fn placeholder() {
        let templates = parse(&tmpl_line("${x}")).unwrap();
        let segments = &templates[0].lines[0].segments;

        assert_eq!(segments, &[Segment::Placeholder("x".into())]);
    }

    #[test]
    fn raw_content() {
        let templates = parse(&tmpl_line("content")).unwrap();
        let segments = &templates[0].lines[0].segments;

        assert_eq!(segments, &[Segment::Content("content".into())]);
    }

    #[test]
    fn escaped_dollar() {
        let templates = parse(&tmpl_line("\\$")).unwrap();
        let segments = &templates[0].lines[0].segments;

        assert_eq!(segments, &[Segment::Content("$".into())]);
    }

    #[test]
    fn escaped_placeholder() {
        let templates = parse(&tmpl_line("\\${x}")).unwrap();
        let segments = &templates[0].lines[0].segments;

        assert_eq!(
            segments,
            &[Segment::Content("$".into()), Segment::Content("{x}".into())]
        );
    }
}