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 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}