morgana_core/syntax/source/
string.rs1use stdext::function_name;
2
3use super::{range::Pos, Source};
4
5#[derive(Debug)]
6pub struct StringSource {
7 pub name: Option<String>,
8 content: String,
9 idx: usize,
10 pub line: u32,
11 pub col: u32,
12}
13
14impl StringSource {
15 pub fn new(name: Option<String>, content: String) -> Self {
16 Self {
17 name,
18 content,
19 idx: 0,
20 line: 1,
21 col: 1,
22 }
23 }
24}
25
26impl Source for StringSource {
27 fn filename(&self) -> Option<String> {
28 log::trace!("{}", function_name!());
29 None
30 }
31
32 fn eat(&mut self) -> Option<char> {
33 log::trace!("{}", function_name!());
34 let mut chars = self.content[self.idx..].chars();
35 match chars.next() {
36 Some(c) => {
37 if c == '\n' {
38 self.line += 1;
39 self.col = 1;
40 } else {
41 self.col += 1;
42 }
43
44 self.idx += c.len_utf8();
45 Some(c)
46 }
47 None => None,
48 }
49 }
50
51 fn pos(&self) -> Pos {
52 log::trace!("{}", function_name!());
53 let filename = self.filename().clone();
54 Pos {
55 filename,
56 line: self.line,
57 col: self.col,
58 }
59 }
60
61 fn peek(&self) -> Option<char> {
62 log::trace!("{}", function_name!());
63 let mut chars = self.content[self.idx..].chars();
64 chars.next()
65 }
66}
67
68impl From<String> for StringSource {
69 fn from(value: String) -> Self {
70 Self::new(None, value)
71 }
72}