summaryrefslogtreecommitdiffstats
path: root/crates/rebel-parse/src/token.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/rebel-parse/src/token.rs')
-rw-r--r--crates/rebel-parse/src/token.rs34
1 files changed, 33 insertions, 1 deletions
diff --git a/crates/rebel-parse/src/token.rs b/crates/rebel-parse/src/token.rs
index 5e6b741..d147205 100644
--- a/crates/rebel-parse/src/token.rs
+++ b/crates/rebel-parse/src/token.rs
@@ -1,4 +1,4 @@
-#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Token<'a> {
Ident(&'a str),
Punct(Punct),
@@ -27,3 +27,35 @@ pub enum StringKind {
RawString,
ScriptString,
}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct TokenStream<'a>(pub Vec<Token<'a>>);
+
+impl<'a> peg::Parse for TokenStream<'a> {
+ type PositionRepr = usize;
+
+ fn start(&self) -> usize {
+ 0
+ }
+
+ fn is_eof(&self, pos: usize) -> bool {
+ pos >= self.0.len()
+ }
+
+ fn position_repr(&self, pos: usize) -> Self::PositionRepr {
+ pos
+ }
+}
+
+impl<'input, 'a: 'input> peg::ParseElem<'input> for TokenStream<'a> {
+ type Element = &'input Token<'a>;
+
+ fn parse_elem(&'input self, pos: usize) -> peg::RuleResult<Self::Element> {
+ use peg::RuleResult;
+
+ match self.0[pos..].first() {
+ Some(c) => RuleResult::Matched(pos + 1, c),
+ None => RuleResult::Failed,
+ }
+ }
+}