1use serde::{Deserialize, Serialize};
2
3use crate::{FatToken, Span, TokenKind};
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
6pub struct Token {
7 pub span: Span,
8 pub kind: TokenKind,
9}
10
11impl Token {
12 pub fn new(span: Span, kind: TokenKind) -> Self {
13 Self { span, kind }
14 }
15
16 pub fn to_fat(&self, source: &[char]) -> FatToken {
18 let content = self.span.get_content(source).to_vec();
19
20 FatToken {
21 content,
22 kind: self.kind.clone(),
23 }
24 }
25}
26
27#[cfg(test)]
28mod tests {
29 use crate::{
30 TokenStringExt,
31 parsers::{Parser, PlainEnglish},
32 };
33
34 #[test]
35 fn parses_sentences_correctly() {
36 let text = "There were three little pigs. They built three little homes.";
37 let chars: Vec<char> = text.chars().collect();
38 let toks = PlainEnglish.parse(&chars);
39
40 let mut sentence_strs = vec![];
41
42 for sentence in toks.iter_sentences() {
43 if let Some(span) = sentence.span() {
44 sentence_strs.push(span.get_content_string(&chars));
45 }
46 }
47
48 assert_eq!(
49 sentence_strs,
50 vec![
51 "There were three little pigs.",
52 " They built three little homes."
53 ]
54 )
55 }
56}