diff options
Diffstat (limited to 'src/run/mod.rs')
| -rw-r--r-- | src/run/mod.rs | 25 |
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) } |
