aboutsummaryrefslogtreecommitdiffstats
path: root/src/run/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/run/mod.rs')
-rw-r--r--src/run/mod.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/run/mod.rs b/src/run/mod.rs
index f727b01..459c898 100644
--- a/src/run/mod.rs
+++ b/src/run/mod.rs
@@ -19,6 +19,7 @@ pub enum ExecError {
ErrorStack(Vec<ExecError>),
Panic,
AliasDepthExceeded,
+ Parse(crate::parse::ParseError),
}
impl ExecError {
@@ -61,6 +62,7 @@ impl ExecError {
out
}
ExecError::AliasDepthExceeded => "alias depth exceeded".to_string(),
+ ExecError::Parse(pe) => format!("parse error: {pe:?}"),
}
}
}
@@ -515,6 +517,16 @@ pub fn run_script(se: Arc<Mutex<Session>>, script: crate::parse::Script) {
}
}
+pub fn source(se: Arc<Mutex<Session>>, file: &bstr) -> Result<(), ExecError> {
+ let mut f = File::open(OsStr::from_bytes(file)).map_err(ExecError::IO)?;
+ let mut buf = Vec::new();
+ f.read_to_end(&mut buf).map_err(ExecError::IO)?;
+ let script = parse::Script::parse_from_bytes(&buf).map_err(ExecError::Parse)?;
+ // TODO: error propagation
+ run_script(se, script);
+ Ok(())
+}
+
#[derive(Debug)]
pub enum BuiltinError {
IO(std::io::Error),
@@ -579,6 +591,7 @@ const BUILTINS: &[&'static dyn BuiltinClone] = &[
&builtin::bind::new(),
&builtin::exit,
&builtin::ct,
+ &builtin::source,
];
pub fn builtin_map() -> HashMap<BString, &'static dyn BuiltinClone> {