aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Maier <>2026-03-07 17:18:58 +0100
committerJonas Maier <>2026-03-07 17:18:58 +0100
commit8fcde466805466c7ecebfc3cd7d4340117a29576 (patch)
tree5e9a061c4e4a480dd716ec285465c3c928483a16
parent18482bef18068b1804dfc83283eb99e639245359 (diff)
downloadpish-8fcde466805466c7ecebfc3cd7d4340117a29576.tar.gz
functions!!
-rw-r--r--src/run/mod.rs25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/run/mod.rs b/src/run/mod.rs
index f767434..0b9aef8 100644
--- a/src/run/mod.rs
+++ b/src/run/mod.rs
@@ -8,6 +8,7 @@ use crate::*;
mod builtin;
+#[derive(Debug)]
enum ExecError {
UnknownVariable(BString),
ExecError(i32),
@@ -16,6 +17,7 @@ enum ExecError {
#[derive(Clone)]
struct Executor {
se: Arc<Mutex<Session>>,
+ args: Option<Vec<BString>>,
}
impl Executor {
@@ -121,8 +123,16 @@ impl Executor {
threads.push(handle);
}
- CommandKind::Fun(_ast) => {
- todo!()
+ CommandKind::Fun(ast) => {
+ let mut this = self.clone();
+
+ let mut args = Vec::with_capacity(cmd.args.len() + 1);
+ args.push(cmd.cmd.clone());
+ args.extend_from_slice(&cmd.args);
+ this.args = Some(args);
+
+ let ast = ast.expand(&mut this)?;
+ this.execute(ast, prev_reader, writer).unwrap();
}
}
@@ -206,9 +216,12 @@ impl parse::Expander for Executor {
.ok()
.and_then(|x| x.parse::<usize>().ok())
{
- match std::env::args_os().skip(x).next() {
- Some(arg) => return Ok(arg.into_encoded_bytes()),
- None => (),
+ if let Some(args) = &self.args {
+ if x < args.len() {
+ return Ok(args[x].clone());
+ }
+ } else if let Some(arg) = std::env::args_os().skip(x).next() {
+ return Ok(arg.into_encoded_bytes());
}
}
}
@@ -239,7 +252,7 @@ impl parse::Expander for Executor {
}
fn exec(se: Arc<Mutex<Session>>, ast: Ast<PreExpansion>) -> Result<(), ExecError> {
- let mut exec = Executor { se };
+ let mut exec = Executor { se, args: None };
let ast = ast.expand(&mut exec)?;
exec.execute(ast, None, None)
}