runic_kit/
source.rs

1//! This module defines the `Source` struct, which encapsulates source code and its associated filename.
2
3/// Represents source code along with its filename.
4#[derive(Debug)]
5pub struct Source<'a> {
6    /// The filename of the source code.
7    pub filename: &'a str,
8    /// The actual source code as a string.
9    pub code: String,
10}
11
12impl<'a> Source<'a> {
13    /// Creates a new `Source` instance, reading the source code from the given filename.
14    pub fn new(filename: &'a str) -> Result<Self, std::io::Error> {
15        let code = std::fs::read_to_string(filename)?;
16        Ok(Source { filename, code })
17    }
18
19    /// Creates a new `Source` instance from a string slice.
20    pub fn from_str(filename: &'a str, code: &'a str) -> Self {
21        Source {
22            filename,
23            code: code.to_string(),
24        }
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_source_new() {
34        let filename = "test_file.txt";
35        let code = "fn main() { println!(\"Hello, world!\"); }";
36        std::fs::write(filename, code).unwrap();
37
38        let source = Source::new(filename).unwrap();
39        assert_eq!(source.filename, filename);
40        assert_eq!(source.code, code);
41
42        std::fs::remove_file(filename).unwrap();
43    }
44
45    #[test]
46    fn test_source_from_str() {
47        let filename = "test_file.txt";
48        let code = "fn main() { println!(\"Hello, world!\"); }";
49        let source = Source::from_str(filename, code);
50
51        assert_eq!(source.filename, filename);
52        assert_eq!(source.code, code);
53    }
54}