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.rs28
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> {