use super::{ParseResult, expr};
use crate::ast::Placeholder;
use crate::parser::primitives::{literal, try_literal, zero_or_more_spaces};
use crate::reader::Reader;
pub fn parse(reader: &mut Reader) -> ParseResult<Placeholder> {
try_literal("{{", reader)?;
let space0 = zero_or_more_spaces(reader)?;
let expr = expr::parse(reader)?;
let space1 = zero_or_more_spaces(reader)?;
literal("}}", reader)?;
Ok(Placeholder {
space0,
expr,
space1,
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ast::{Expr, ExprKind, SourceInfo, Variable, Whitespace};
use crate::parser::ParseErrorKind;
use crate::reader::Pos;
#[test]
fn test_ok() {
let mut reader = Reader::new("{{ name}}");
assert_eq!(
parse(&mut reader).unwrap(),
Placeholder {
space0: Whitespace {
value: String::from(" "),
source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 4)),
},
expr: Expr {
kind: ExprKind::Variable(Variable {
name: "name".to_string(),
source_info: SourceInfo::new(Pos::new(1, 4), Pos::new(1, 8)),
}),
source_info: SourceInfo::new(Pos::new(1, 4), Pos::new(1, 8)),
},
space1: Whitespace {
value: String::new(),
source_info: SourceInfo::new(Pos::new(1, 8), Pos::new(1, 8)),
},
}
);
}
#[test]
fn test_error() {
let mut reader = Reader::new("{{host>}}");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 7 });
assert_eq!(
error.kind,
ParseErrorKind::Expecting {
value: String::from("}}")
}
);
assert!(!error.recoverable);
}
#[test]
fn test_error_eof() {
let mut reader = Reader::new("{{host");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 7 });
assert_eq!(
error.kind,
ParseErrorKind::Expecting {
value: String::from("}}")
}
);
assert!(!error.recoverable);
}
}