use super::errors::{LexError, LexErrorKind, LexResult};
use super::*;
impl Lexer {
pub(super) fn lex_ident_block(&mut self) -> LexResult<SyntaxKind> {
let remaining = self.remaining();
if remaining.starts_with("|}") {
self.advance(2);
self.pop_mode();
return Ok(SyntaxKind::PipeClose);
}
if remaining.starts_with("@{") {
self.advance(2);
self.push_mode(LexerMode::Interpolation);
self.brace_depth = 1;
return Ok(SyntaxKind::At);
}
let start = self.pos;
while self.pos < self.input.len() {
let r = self.remaining();
if r.starts_with("|}") || r.starts_with("@{") {
break;
}
if let Some(c) = self.peek() {
self.advance(c.len_utf8());
}
}
if self.pos > start {
Ok(SyntaxKind::Text)
} else if self.pos >= self.input.len() {
Err(
LexError::new(LexErrorKind::UnterminatedIdentBlock, self.pos)
.with_context("ident block {|...|}"),
)
} else {
Ok(SyntaxKind::Error)
}
}
}