diff options
| author | Jonas Maier <jonas@x77.dev> | 2026-05-12 21:06:03 +0200 |
|---|---|---|
| committer | Jonas Maier <jonas@x77.dev> | 2026-05-12 21:06:03 +0200 |
| commit | 0e5d95663aaac8b7368c82290476694b561536d3 (patch) | |
| tree | 3d1118430d6b05daf2cc8b81c3dd570feb26452e /src/run/mod.rs | |
| parent | 90b34c8cc26d9adf2a1e8ae5169fb6dd0edb01c8 (diff) | |
| download | pish-0e5d95663aaac8b7368c82290476694b561536d3.tar.gz | |
variable refactor: completion also for magic vars
Diffstat (limited to 'src/run/mod.rs')
| -rw-r--r-- | src/run/mod.rs | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/src/run/mod.rs b/src/run/mod.rs index 5b2d32d..55bdd29 100644 --- a/src/run/mod.rs +++ b/src/run/mod.rs @@ -9,6 +9,9 @@ use crate::wait::{ChildWaiter, ThreadWaiter}; use crate::*; mod builtin; +mod var; + +pub use var::Vars; #[derive(Debug)] pub enum ExecError { @@ -320,7 +323,7 @@ impl Executor { } fn execute_var_assign(&mut self, va: parse::VarAssign<PostExpansion>) -> SpawnedCmd { - self.se.lock().unwrap().vars.insert(va.var, va.val); + self.se.lock().unwrap().vars.set(va.var, va.val); SpawnedCmd::Joined(Ok(())) } @@ -455,18 +458,11 @@ impl parse::Expander for Executor { var: BString, default: Option<BString>, ) -> Result<BString, Self::Error> { - match &var[..] { - b"CWD_PRETTY" => return Ok(crate::pretty_cwd().into_bytes()), - b"PISH_VERSION" => return Ok(crate::consts::PISH_VERSION.as_bytes().to_vec()), - b"PISH_COMMIT" => return Ok(crate::consts::PISH_COMMIT.as_bytes().to_vec()), - b"PISH_DIRTY" => return Ok(vec![crate::consts::PISH_DIRTY as u8 + b'0']), - _ => {} - } - if var.is_empty() { return Err(ExecError::UnknownVariable(var)); } + // TODO: this should probably also go somewhere in the var module. if var[0].is_ascii_digit() && let Some(x) = String::from_utf8(var.clone()) .ok() @@ -481,17 +477,15 @@ impl parse::Expander for Executor { } } - if let Some(val) = self.se.lock().unwrap().vars.get(&var) { - return Ok(val.clone()); + if let Some(val) = self.se.lock().unwrap().vars.lookup(&var) { + return Ok(val); } - match std::env::var_os(OsStr::from_bytes(&var)) { - Some(val) => Ok(val.as_bytes().to_vec()), - None => match default { - Some(d) => Ok(d), - None => Err(ExecError::UnknownVariable(var)), - }, + if let Some(dfl) = default { + return Ok(dfl); } + + Err(ExecError::UnknownVariable(var)) } fn expand_cmd(&mut self, ast: Ast<parse::PostExpansion>) -> Result<BString, Self::Error> { |
