logos_iter/
lib.rs

1#![doc = include_str!("../README.md")]
2#![cfg_attr(not(feature = "std"), no_std)]
3
4mod peekable;
5
6pub use peekable::PeekableLexer;
7
8use logos::{Lexer, Logos, Source, Span};
9
10pub trait LogosIter<'source, T>: Iterator<Item = T>
11where
12    T: Logos<'source>,
13{
14    fn span(&self) -> Span;
15
16    fn slice(&self) -> &'source <T::Source as Source>::Slice;
17
18    fn source(&self) -> &'source T::Source;
19
20    fn remainder(&self) -> &'source <T::Source as Source>::Slice;
21
22    fn bump(&mut self, n: usize);
23
24    fn extras(&self) -> &T::Extras;
25
26    fn extras_mut(&mut self) -> &mut T::Extras;
27
28    /// See [`PeekableLexer`].
29    // we don't use `peekable` name to avoid ambiguity (it's a compiler error)
30    // between `LogosIter`'s method and `Iterator`'s one
31    fn peekable_lexer(self) -> PeekableLexer<'source, Self, T>
32    where
33        Self: Sized,
34    {
35        PeekableLexer {
36            lexer: self,
37            peeked: None,
38        }
39    }
40}
41
42impl<'source, T> LogosIter<'source, T> for Lexer<'source, T>
43where
44    T: Logos<'source>,
45{
46    fn span(&self) -> Span {
47        Lexer::span(self)
48    }
49
50    fn slice(&self) -> &'source <T::Source as Source>::Slice {
51        Lexer::slice(self)
52    }
53
54    fn source(&self) -> &'source T::Source {
55        Lexer::source(self)
56    }
57
58    fn remainder(&self) -> &'source <T::Source as Source>::Slice {
59        Lexer::remainder(self)
60    }
61
62    fn bump(&mut self, n: usize) {
63        Lexer::bump(self, n)
64    }
65
66    fn extras(&self) -> &T::Extras {
67        &self.extras
68    }
69
70    fn extras_mut(&mut self) -> &mut T::Extras {
71        &mut self.extras
72    }
73}