1use super::*;
2
3pub struct Loader {
4 srcs: Arena<String>,
5 paths: Arena<PathBuf>,
6}
7
8impl Loader {
9 pub fn new() -> Self {
10 Self {
11 srcs: Arena::new(),
12 paths: Arena::new(),
13 }
14 }
15
16 pub fn load<'src>(
17 &'src self,
18 root: &Path,
19 path: &Path,
20 ) -> RunResult<(&'src Path, &'src str)> {
21 let src = fs::read_to_string(path).map_err(|io_error| Error::Load {
22 path: path.into(),
23 io_error,
24 })?;
25
26 let relative = path.strip_prefix(root.parent().unwrap()).unwrap_or(path);
27
28 Ok((self.paths.alloc(relative.into()), self.srcs.alloc(src)))
29 }
30}