1use crate::{span::Span, traits::TokenKind};
4use builder_pattern::Builder;
5
6#[derive(Builder, Clone, Debug)]
8pub struct TokenTrivia<K: TokenKind> {
9 pub kind: K,
11 pub span: Span,
13 #[into]
15 pub text: String,
16}
17
18impl<K: TokenKind> TokenTrivia<K> {
19 pub fn create(kind: K, span: Span, text: impl Into<String>) -> Self {
23 Self {
24 kind,
25 span,
26 text: text.into(),
27 }
28 }
29}
30
31#[derive(Builder, Clone, Debug)]
33pub struct Token<K: TokenKind> {
34 pub kind: K,
36 pub span: Span,
38 #[into]
40 pub lexeme: String,
41 #[default(Vec::new())]
43 pub leading_trivia: Vec<TokenTrivia<K>>,
44 #[default(Vec::new())]
46 pub trailing_trivia: Vec<TokenTrivia<K>>,
47}
48
49impl<K: TokenKind> Token<K> {
50 pub fn create(
54 kind: K,
55 span: Span,
56 lexeme: impl Into<String>,
57 leading_trivia: Vec<TokenTrivia<K>>,
58 trailing_trivia: Vec<TokenTrivia<K>>,
59 ) -> Self {
60 Self {
61 kind,
62 span,
63 lexeme: lexeme.into(),
64 leading_trivia,
65 trailing_trivia,
66 }
67 }
68
69 pub fn with_trivia(
71 mut self,
72 leading: Vec<TokenTrivia<K>>,
73 trailing: Vec<TokenTrivia<K>>,
74 ) -> Self {
75 self.leading_trivia = leading;
76 self.trailing_trivia = trailing;
77 self
78 }
79}