diff --git a/src/lib/shell/assignments.rs b/src/lib/shell/assignments.rs index 2b1ab521080242c2a73484aee102b1f35527e102..d5ef2c02ffacd0ed47bfb7c5248ea10c4d3e6a64 100644 --- a/src/lib/shell/assignments.rs +++ b/src/lib/shell/assignments.rs @@ -20,22 +20,39 @@ fn list_vars(shell: &Shell<'_>) -> Result<(), io::Error> { let stdout = io::stdout(); let mut buffer = BufWriter::new(stdout.lock()); - // Write all the string variables to the buffer. - buffer.write_all(b"# String Variables\n")?; - for (key, val) in shell.variables.string_vars() { - writeln!(buffer, "{} = {}", key, val)?; - } - - // Then immediately follow that with a list of array variables. - buffer.write_all(b"\n# Array Variables\n")?; - for (key, val) in shell.variables.arrays() { - write!(buffer, "{} = [ ", key)?; - let mut vars = val.iter(); - if let Some(var) = vars.next() { - write!(buffer, "'{}' ", var)?; - vars.map(|var| write!(buffer, ", '{}' ", var)).collect::, _>>()?; + for (key, val) in shell.variables.variables() { + write!(buffer, "{} = ", key)?; + match val { + Value::Str(ref s) => writeln!(buffer, "{}", s)?, + Value::Array(ref vals) => { + write!(buffer, "[")?; + let mut vals = vals.iter(); + if let Some(val) = vals.next() { + write!(buffer, " '{}'", val)?; + vals.map(|v| write!(buffer, ", '{}'", v)).collect::, _>>()?; + } + writeln!(buffer, " ]")?; + }, + Value::HashMap(ref s) => { + write!(buffer, "[")?; + let mut vals = s.iter(); + if let Some((key, val)) = vals.next() { + write!(buffer, " '{}'='{}'", key, val)?; + vals.map(|(k, v)| write!(buffer, ", '{}'='{}'", k, v)).collect::, _>>()?; + } + writeln!(buffer, " ]")?; + }, + Value::BTreeMap(ref s) => { + write!(buffer, "[")?; + let mut vals = s.iter(); + if let Some((key, val)) = vals.next() { + write!(buffer, " '{}'='{}'", key, val)?; + vals.map(|(k, v)| write!(buffer, ", '{}'='{}'", k, v)).collect::, _>>()?; + } + writeln!(buffer, " ]")?; + }, + _ => unsafe { std::hint::unreachable_unchecked() } } - writeln!(buffer, "]")?; } Ok(()) } diff --git a/src/lib/shell/variables.rs b/src/lib/shell/variables.rs index b4ee1d642b2e84fbe7fbcb6679c7afe89f19bd67..d68d2f525373e1580d97398c022b4340090f6351 100644 --- a/src/lib/shell/variables.rs +++ b/src/lib/shell/variables.rs @@ -54,6 +54,21 @@ impl<'a> Variables<'a> { }) } + /// Get all the variables + pub fn variables(&self) -> impl Iterator>>)> { + self.0.scopes().rev().flat_map(|map| { + map.iter().filter_map(|(key, val)| { + match val { + val @ Value::Array(_) | + val @ Value::Str(_) | + val @ Value::HashMap(_) | + val @ Value::BTreeMap(_) => Some((key, val)), + _ => None + } + }) + }) + } + /// Get all the array values pub fn arrays(&self) -> impl Iterator>>)> { self.0.scopes().rev().flat_map(|map| {