1use crate::Token;
2use logos::{self, Logos};
3
4pub struct Lexer<'a> {
5 inner: logos::Lexer<'a, Token>,
6}
7
8impl<'a> Lexer<'a> {
9 pub fn new(input: &'a str) -> Self {
10 Self {
11 inner: Token::lexer(input),
12 }
13 }
14}
15
16impl<'a> Iterator for Lexer<'a> {
17 type Item = (Token, &'a str);
18
19 fn next(&mut self) -> Option<Self::Item> {
20 let kind = self.inner.next()?;
21 let text = self.inner.slice();
22 Some((kind, text))
23 }
24}
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29
30 #[test]
31 fn lex_example() {
32 let example = include_str!("../test/example.yul");
33 let tokens = Lexer::new(example)
34 .map(|(a, b)| (a, b.to_string()))
35 .collect::<Vec<_>>();
36 let expected: Vec<(Token, String)> =
37 serde_json::from_str(include_str!("../test/example.lexer.json")).unwrap();
38 assert_eq!(tokens, expected);
39 }
40
41 #[test]
42 fn lex_erc20() {
43 let example = include_str!("../test/erc20.yul");
44 let tokens = Lexer::new(example)
45 .map(|(a, b)| (a, b.to_string()))
46 .collect::<Vec<_>>();
47 let expected: Vec<(Token, String)> =
48 serde_json::from_str(include_str!("../test/erc20.lexer.json")).unwrap();
49 assert_eq!(tokens, expected);
50 }
51}