morgana_core/syntax/source/
string.rs

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