diff --git a/src/context/file_access_interface.rs b/src/context/file_access_interface.rs new file mode 100644 index 0000000..10d1536 --- /dev/null +++ b/src/context/file_access_interface.rs @@ -0,0 +1,13 @@ +use std::path::Path; + +pub trait FileAccessInterface { + fn read_file>(&self, path: P) -> Result>; +} + +pub struct LocalFileAccessInterface; + +impl FileAccessInterface for LocalFileAccessInterface { + fn read_file>(&self, path: P) -> Result> { + Ok(std::fs::read_to_string(path)?) + } +} diff --git a/src/context/global_settings.rs b/src/context/global_settings.rs index 6299672..cc7e644 100644 --- a/src/context/global_settings.rs +++ b/src/context/global_settings.rs @@ -1,16 +1,20 @@ +use super::FileAccessInterface; +use super::LocalFileAccessInterface; use crate::types::Object; // TODO: Ultimately, I think we'll need most of this: https://orgmode.org/manual/In_002dbuffer-Settings.html #[derive(Debug, Clone)] -pub struct GlobalSettings<'g, 's> { +pub struct GlobalSettings<'g, 's, F: FileAccessInterface> { pub radio_targets: Vec<&'g Vec>>, + pub file_access: F, } impl<'g, 's> GlobalSettings<'g, 's> { pub fn new() -> Self { GlobalSettings { radio_targets: Vec::new(), + file_access: LocalFileAccessInterface, } } } diff --git a/src/context/mod.rs b/src/context/mod.rs index 32e04f0..fbf4618 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -2,6 +2,7 @@ use crate::error::Res; use crate::parser::OrgSource; mod exiting; +mod file_access_interface; mod global_settings; mod list; mod parser_context; @@ -18,6 +19,8 @@ pub trait Matcher = for<'s> Fn(OrgSource<'s>) -> Res, OrgSource<'s pub type DynMatcher<'c> = dyn Matcher + 'c; pub use exiting::ExitClass; +pub use file_access_interface::FileAccessInterface; +pub use file_access_interface::LocalFileAccessInterface; pub use global_settings::GlobalSettings; pub use list::List; pub use parser_context::Context;