Working example

This commit is contained in:
2023-03-10 13:58:16 +00:00
parent 35a081162f
commit 180ebb56fa
62 changed files with 1487 additions and 372 deletions

View File

@@ -0,0 +1,61 @@
mod file_loader;
mod ext_loader;
mod string_loader;
mod map_loader;
mod fnlib_loader;
mod overlay_loader;
mod prefix_loader;
pub use file_loader::file_loader;
pub use ext_loader::ext_loader;
pub use fnlib_loader::fnlib_loader;
pub use string_loader::string_loader;
pub use map_loader::map_loader;
pub use overlay_loader::overlay_loader;
pub use prefix_loader::prefix_loader;
use std::{rc::Rc, io};
use crate::parse::FileEntry;
#[derive(Clone, Debug)]
pub enum LoadingError {
/// An IO operation has failed (i.e. no read permission)
IOErr(Rc<io::Error>),
/// The leaf does not exist
UnknownNode(String),
/// The leaf and at least the immediately containing namespace don't exist
Missing(String)
}
impl From<io::Error> for LoadingError {
fn from(inner: io::Error) -> Self {
LoadingError::IOErr(Rc::new(inner))
}
}
#[derive(Debug, Clone)]
pub enum Loaded {
Module(String),
Namespace(Vec<String>),
External(Vec<FileEntry>)
}
pub trait Loader {
fn load<'s, 'a>(&'s mut self, path: &'a [&'a str]) -> Result<Loaded, LoadingError>;
fn boxed<'a>(self) -> Box<dyn 'a + Loader> where Self: 'a + Sized {
Box::new(self)
}
}
impl<T> Loader for T where T: for<'a> FnMut(&'a [&'a str]) -> Result<Loaded, LoadingError> {
fn load(&mut self, path: &[&str]) -> Result<Loaded, LoadingError> {
(self)(path)
}
}
impl Loader for Box<dyn Loader> {
fn load<'s, 'a>(&'s mut self, path: &'a [&'a str]) -> Result<Loaded, LoadingError> {
self.as_mut().load(path)
}
}