diff options
Diffstat (limited to 'src/libstd/sys_common/process.rs')
| -rw-r--r-- | src/libstd/sys_common/process.rs | 51 |
1 files changed, 14 insertions, 37 deletions
diff --git a/src/libstd/sys_common/process.rs b/src/libstd/sys_common/process.rs index 4d40dec9724..bdf66fca359 100644 --- a/src/libstd/sys_common/process.rs +++ b/src/libstd/sys_common/process.rs @@ -1,47 +1,20 @@ #![allow(dead_code)] #![unstable(feature = "process_internals", issue = "0")] -use crate::ffi::{OsStr, OsString}; -use crate::env; use crate::collections::BTreeMap; -use crate::borrow::Borrow; - -pub trait EnvKey: - From<OsString> + Into<OsString> + - Borrow<OsStr> + Borrow<Self> + AsRef<OsStr> + - Ord + Clone {} - -// Implement a case-sensitive environment variable key -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] -pub struct DefaultEnvKey(OsString); - -impl From<OsString> for DefaultEnvKey { - fn from(k: OsString) -> Self { DefaultEnvKey(k) } -} - -impl From<DefaultEnvKey> for OsString { - fn from(k: DefaultEnvKey) -> Self { k.0 } -} - -impl Borrow<OsStr> for DefaultEnvKey { - fn borrow(&self) -> &OsStr { &self.0 } -} - -impl AsRef<OsStr> for DefaultEnvKey { - fn as_ref(&self) -> &OsStr { &self.0 } -} - -impl EnvKey for DefaultEnvKey {} +use crate::env; +use crate::ffi::{OsStr, OsString}; +use crate::sys::process::EnvKey; // Stores a set of changes to an environment #[derive(Clone, Debug)] -pub struct CommandEnv<K> { +pub struct CommandEnv { clear: bool, saw_path: bool, - vars: BTreeMap<K, Option<OsString>> + vars: BTreeMap<EnvKey, Option<OsString>> } -impl<K: EnvKey> Default for CommandEnv<K> { +impl Default for CommandEnv { fn default() -> Self { CommandEnv { clear: false, @@ -51,10 +24,10 @@ impl<K: EnvKey> Default for CommandEnv<K> { } } -impl<K: EnvKey> CommandEnv<K> { +impl CommandEnv { // Capture the current environment with these changes applied - pub fn capture(&self) -> BTreeMap<K, OsString> { - let mut result = BTreeMap::<K, OsString>::new(); + pub fn capture(&self) -> BTreeMap<EnvKey, OsString> { + let mut result = BTreeMap::<EnvKey, OsString>::new(); if !self.clear { for (k, v) in env::vars_os() { result.insert(k.into(), v); @@ -90,7 +63,7 @@ impl<K: EnvKey> CommandEnv<K> { !self.clear && self.vars.is_empty() } - pub fn capture_if_changed(&self) -> Option<BTreeMap<K, OsString>> { + pub fn capture_if_changed(&self) -> Option<BTreeMap<EnvKey, OsString>> { if self.is_unchanged() { None } else { @@ -103,6 +76,7 @@ impl<K: EnvKey> CommandEnv<K> { self.maybe_saw_path(&key); self.vars.insert(key.to_owned().into(), Some(value.to_owned())); } + pub fn remove(&mut self, key: &OsStr) { self.maybe_saw_path(&key); if self.clear { @@ -111,13 +85,16 @@ impl<K: EnvKey> CommandEnv<K> { self.vars.insert(key.to_owned().into(), None); } } + pub fn clear(&mut self) { self.clear = true; self.vars.clear(); } + pub fn have_changed_path(&self) -> bool { self.saw_path || self.clear } + fn maybe_saw_path(&mut self, key: &OsStr) { if !self.saw_path && key == "PATH" { self.saw_path = true; |
