2 #![unstable(feature = "process_internals", issue = "0")]
4 use crate::collections
::BTreeMap
;
6 use crate::ffi
::{OsStr, OsString}
;
7 use crate::sys
::process
::EnvKey
;
9 // Stores a set of changes to an environment
10 #[derive(Clone, Debug)]
11 pub struct CommandEnv
{
14 vars
: BTreeMap
<EnvKey
, Option
<OsString
>>,
17 impl Default
for CommandEnv
{
18 fn default() -> Self {
19 CommandEnv { clear: false, saw_path: false, vars: Default::default() }
24 // Capture the current environment with these changes applied
25 pub fn capture(&self) -> BTreeMap
<EnvKey
, OsString
> {
26 let mut result
= BTreeMap
::<EnvKey
, OsString
>::new();
28 for (k
, v
) in env
::vars_os() {
29 result
.insert(k
.into(), v
);
32 for (k
, maybe_v
) in &self.vars
{
33 if let &Some(ref v
) = maybe_v
{
34 result
.insert(k
.clone(), v
.clone());
42 // Apply these changes directly to the current environment
45 for (k
, _
) in env
::vars_os() {
49 for (key
, maybe_val
) in self.vars
.iter() {
50 if let &Some(ref val
) = maybe_val
{
51 env
::set_var(key
, val
);
58 pub fn is_unchanged(&self) -> bool
{
59 !self.clear
&& self.vars
.is_empty()
62 pub fn capture_if_changed(&self) -> Option
<BTreeMap
<EnvKey
, OsString
>> {
63 if self.is_unchanged() { None }
else { Some(self.capture()) }
66 // The following functions build up changes
67 pub fn set(&mut self, key
: &OsStr
, value
: &OsStr
) {
68 self.maybe_saw_path(&key
);
69 self.vars
.insert(key
.to_owned().into(), Some(value
.to_owned()));
72 pub fn remove(&mut self, key
: &OsStr
) {
73 self.maybe_saw_path(&key
);
75 self.vars
.remove(key
);
77 self.vars
.insert(key
.to_owned().into(), None
);
81 pub fn clear(&mut self) {
86 pub fn have_changed_path(&self) -> bool
{
87 self.saw_path
|| self.clear
90 fn maybe_saw_path(&mut self, key
: &OsStr
) {
91 if !self.saw_path
&& key
== "PATH" {