From a1c8c9dd433c00dc2b4be82e46b9a21306c48e79 Mon Sep 17 00:00:00 2001
From: Michael Aaron Murphy <mmstickman@gmail.com>
Date: Fri, 13 Oct 2017 12:05:17 -0400
Subject: [PATCH] Optimize let variable listing

---
 src/builtins/mod.rs | 35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/builtins/mod.rs b/src/builtins/mod.rs
index 2733f410..75f40259 100644
--- a/src/builtins/mod.rs
+++ b/src/builtins/mod.rs
@@ -22,7 +22,7 @@ use self::variables::{alias, drop_alias, drop_array, drop_variable};
 
 use fnv::FnvHashMap;
 use std::error::Error;
-use std::io::{self, Write};
+use std::io::{self, Write, BufWriter};
 
 use parser::QuoteTerminator;
 use shell::{self, FlowLogic, Shell, ShellHistory};
@@ -178,9 +178,40 @@ impl Builtin {
 // Definitions of simple builtins go here
 
 fn list_vars(_: &[&str], shell: &mut Shell) -> i32 {
+    let stdout = io::stdout();
+    let mut buffer = BufWriter::new(stdout.lock());
+
+    // Small function for formatting and append an array entry to a string buffer.
+    fn print_array<W: Write>(buffer: &mut W, key: &str, array: &[String]) {
+        let _ = buffer.write([key, " = [ "].concat().as_bytes());
+        if array.len() > 1 {
+            let mut vars = array.iter();
+            if let Some(ref var) = vars.next() {
+                let _ = buffer.write(["'", var, "', "].concat().as_bytes());
+                vars.for_each(|ref var| {
+                    let _ = buffer.write(["'", var, "' "].concat().as_bytes());
+                });
+            }
+            let _ = buffer.write(b"]\n");
+        } else {
+            let _ = buffer.write(["'", &array[0], "' ]\n"].concat().as_bytes());
+        }
+    }
+
+    // Write all the string variables to the buffer.
+    let _ = buffer.write(b"# String Variables\n");
     shell.variables.variables.iter().for_each(
-        |(key, val)| println!("{} = {}", key, val)
+        |(key, val)| {
+            let _ = buffer.write([key, " = ", val.as_str(), "\n"].concat().as_bytes());
+        }
     );
+
+    // Then immediately follow that with a list of array variables.
+    let _ = buffer.write(b"\n# Array Variables\n");
+    shell.variables.arrays.iter().for_each(
+        |(key, val)| print_array(&mut buffer, &key, &val)
+    );
+
     SUCCESS
 }
 
-- 
GitLab