From c050ce852b937276e42f277855c7d75e4e448d93 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Mon, 3 Jun 2019 19:41:28 +1200 Subject: [PATCH] Lots of misc improvements --- Cargo.lock | 96 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 ++ src/cli.rs | 1 + src/commands.rs | 5 +- src/commands/cd.rs | 17 ++++--- src/commands/from_json.rs | 30 ++++++++---- src/commands/from_yaml.rs | 54 ++++++++++++++++++++++ src/commands/ls.rs | 11 ++++- src/commands/open.rs | 26 +++++++++-- 9 files changed, 218 insertions(+), 25 deletions(-) create mode 100644 src/commands/from_yaml.rs diff --git a/Cargo.lock b/Cargo.lock index a57d95e081..542948434f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -572,6 +572,31 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "dirs" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "dirs-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "dirs-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "dtoa" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "dunce" version = "1.0.0" @@ -964,6 +989,11 @@ dependencies = [ "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lazy_static" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "lazy_static" version = "1.3.0" @@ -1036,6 +1066,15 @@ dependencies = [ "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "linked-hash-map" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "linked-hash-map" version = "0.5.2" @@ -1182,6 +1221,7 @@ dependencies = [ "conch-parser 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "cursive 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "dirs 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "dunce 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "enum_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1207,8 +1247,10 @@ dependencies = [ "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustyline 4.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde-hjson 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)", "subprocess 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "sysinfo 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1265,6 +1307,14 @@ dependencies = [ "num-traits 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-traits" version = "0.2.7" @@ -1775,11 +1825,28 @@ name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "serde" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "serde-hjson" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "serde_derive" version = "1.0.91" @@ -1800,6 +1867,25 @@ dependencies = [ "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_test" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_yaml" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "shell-words" version = "0.1.0" @@ -2327,6 +2413,9 @@ dependencies = [ "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum directories 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "72d337a64190607d4fcca2cb78982c5dd57f4916e19696b48a575fa746b6cb0f" "checksum dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +"checksum dirs 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1c4ef5a8b902d393339e2a2c7fe573af92ce7e0ee5a3ff827b4c9ad7e07e4fa1" +"checksum dirs-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "937756392ec77d1f2dd9dc3ac9d69867d109a2121479d72c364e42f4cab21e2d" +"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e" "checksum dunce 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0ad6bf6a88548d1126045c413548df1453d9be094a8ab9fd59bf1fdd338da4f" "checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd" @@ -2374,6 +2463,7 @@ dependencies = [ "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lalrpop-util 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9768f55211206d3c17181108d8facb80bdffc1f1e674a67b1dddb2743529ca19" "checksum language-reporting 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "61e5d4e5c7a76724d544bb5652a8a3ded29475a1b260a263b5d6743f5871ac83" +"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum lexical-core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e82e023e062f1d25f807ad182008fba1b46538e999f908a08cc0c29e084462e" @@ -2382,6 +2472,7 @@ dependencies = [ "checksum libssh2-sys 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "126a1f4078368b163bfdee65fbab072af08a1b374a5551b21e87ade27b1fbf9d" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" "checksum line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +"checksum linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d262045c5b87c0861b3f004610afd0e2c851e2908d08b6c870cbb9d5f494ecd" "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" "checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" @@ -2403,6 +2494,7 @@ dependencies = [ "checksum num-integer 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "8b8af8caa3184078cd419b430ff93684cb13937970fcb7639f728992f33ce674" "checksum num-iter 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "50b7cf973f09f27829571927831972c92bfd29de7a5a0148380afd12acf6d124" "checksum num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e96f040177bb3da242b5b1ecf3f54b5d5af3efbbfb18608977a5d2767b22f10" +"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d9c79c952a4a139f44a0fe205c4ee66ce239c0e6ce72cd935f5f7e2f717549dd" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" @@ -2461,9 +2553,13 @@ dependencies = [ "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" "checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde-hjson 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4640cf3168e40c00c874ff1ad436c0f18c37edec101d5d897a4396f617abce29" "checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5" +"checksum serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)" = "38b08a9a90e5260fe01c6480ec7c811606df6d3a660415808c3c3fa8ed95b582" "checksum shell-words 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum signal-hook 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "72ab58f1fda436857e6337dcb6a5aaa34f16c5ddc87b3a8b6ef7a212f90b9c5a" diff --git a/Cargo.toml b/Cargo.toml index 59f4d3065e..ccbd9b0992 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,8 @@ lalrpop-util = "0.17.0" regex = "1.1.6" serde = "1.0.91" serde_json = "1.0.39" +serde-hjson = "0.9.0" +serde_yaml = "0.8" serde_derive = "1.0.91" getset = "0.0.7" logos = "0.10.0-rc2" @@ -52,6 +54,7 @@ enum_derive = "0.1.7" adhoc_derive = "0.1.2" lazy_static = "1.3.0" git2 = "0.8.0" +dirs = "2.0.1" [dependencies.pancurses] version = "0.16" diff --git a/src/cli.rs b/src/cli.rs index 2644373da3..0a98fa9924 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -52,6 +52,7 @@ pub async fn cli() -> Result<(), Box> { command("size", size::size), command("from-json", from_json::from_json), command("from-toml", from_toml::from_toml), + command("from-yaml", from_yaml::from_yaml), command("open", open::open), command("pick", pick::pick), command("split-column", split_column::split_column), diff --git a/src/commands.rs b/src/commands.rs index fa3c307fda..9bf38967e0 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,13 +1,15 @@ crate mod args; crate mod cd; crate mod classified; -crate mod pick; crate mod command; crate mod config; +crate mod first; crate mod from_json; crate mod from_toml; +crate mod from_yaml; crate mod ls; crate mod open; +crate mod pick; crate mod ps; crate mod reject; crate mod select; @@ -16,7 +18,6 @@ crate mod skip; crate mod sort_by; crate mod split_column; crate mod split_row; -crate mod first; crate mod to_array; crate mod to_json; crate mod to_toml; diff --git a/src/commands/cd.rs b/src/commands/cd.rs index 1ebf8bef2a..f39c9161e3 100644 --- a/src/commands/cd.rs +++ b/src/commands/cd.rs @@ -3,16 +3,19 @@ use crate::prelude::*; use std::env; pub fn cd(args: CommandArgs) -> Result { - let target = match args.positional.first() { - // TODO: This needs better infra - None => return Err(ShellError::string(format!("cd must take one arg"))), - Some(v) => v.as_string()?.clone(), + let cwd = args.env.lock().unwrap().cwd().to_path_buf(); + let path = match args.positional.first() { + None => match dirs::home_dir() { + Some(o) => o, + _ => return Err(ShellError::string("Can not change to home directory")), + }, + Some(v) => { + let target = v.as_string()?.clone(); + dunce::canonicalize(cwd.join(&target).as_path())? + } }; - let cwd = args.env.lock().unwrap().cwd().to_path_buf(); - let mut stream = VecDeque::new(); - let path = dunce::canonicalize(cwd.join(&target).as_path())?; let _ = env::set_current_dir(&path); stream.push_back(ReturnValue::change_cwd(path)); Ok(stream.boxed()) diff --git a/src/commands/from_json.rs b/src/commands/from_json.rs index 3a984bac6d..1624d9c7e1 100644 --- a/src/commands/from_json.rs +++ b/src/commands/from_json.rs @@ -1,17 +1,27 @@ -use crate::object::{Primitive, Value, Dictionary, DataDescriptor}; +use crate::object::base::OF64; +use crate::object::{DataDescriptor, Dictionary, Primitive, Value}; use crate::prelude::*; -fn convert_json_value_to_nu_value(v: &serde_json::Value) -> Value { +fn convert_json_value_to_nu_value(v: &serde_hjson::Value) -> Value { match v { - serde_json::Value::Null => Value::Primitive(Primitive::String("".to_string())), - serde_json::Value::Bool(b) => Value::Primitive(Primitive::Boolean(*b)), - serde_json::Value::Number(n) => Value::Primitive(Primitive::Int(n.as_i64().unwrap())), - serde_json::Value::String(s) => Value::Primitive(Primitive::String(s.clone())), - serde_json::Value::Array(a) => Value::List(a.iter().map(|x| convert_json_value_to_nu_value(x)).collect()), - serde_json::Value::Object(o) => { + serde_hjson::Value::Null => Value::Primitive(Primitive::String("".to_string())), + serde_hjson::Value::Bool(b) => Value::Primitive(Primitive::Boolean(*b)), + serde_hjson::Value::F64(n) => Value::Primitive(Primitive::Float(OF64::from(*n))), + serde_hjson::Value::U64(n) => Value::Primitive(Primitive::Int(*n as i64)), + serde_hjson::Value::I64(n) => Value::Primitive(Primitive::Int(*n as i64)), + serde_hjson::Value::String(s) => Value::Primitive(Primitive::String(s.clone())), + serde_hjson::Value::Array(a) => Value::List( + a.iter() + .map(|x| convert_json_value_to_nu_value(x)) + .collect(), + ), + serde_hjson::Value::Object(o) => { let mut collected = Dictionary::default(); for (k, v) in o.iter() { - collected.add(DataDescriptor::from(k.clone()), convert_json_value_to_nu_value(v)); + collected.add( + DataDescriptor::from(k.clone()), + convert_json_value_to_nu_value(v), + ); } Value::Object(collected) } @@ -19,7 +29,7 @@ fn convert_json_value_to_nu_value(v: &serde_json::Value) -> Value { } pub fn from_json_string_to_value(s: String) -> Value { - let v: serde_json::Value = serde_json::from_str(&s).unwrap(); + let v: serde_hjson::Value = serde_hjson::from_str(&s).unwrap(); convert_json_value_to_nu_value(&v) } diff --git a/src/commands/from_yaml.rs b/src/commands/from_yaml.rs new file mode 100644 index 0000000000..171ab3ae0d --- /dev/null +++ b/src/commands/from_yaml.rs @@ -0,0 +1,54 @@ +use crate::object::base::OF64; +use crate::object::{DataDescriptor, Dictionary, Primitive, Value}; +use crate::prelude::*; + +fn convert_yaml_value_to_nu_value(v: &serde_yaml::Value) -> Value { + match v { + serde_yaml::Value::Bool(b) => Value::Primitive(Primitive::Boolean(*b)), + serde_yaml::Value::Number(n) if n.is_i64() => { + Value::Primitive(Primitive::Int(n.as_i64().unwrap())) + } + serde_yaml::Value::Number(n) if n.is_f64() => { + Value::Primitive(Primitive::Float(OF64::from(n.as_f64().unwrap()))) + } + serde_yaml::Value::String(s) => Value::Primitive(Primitive::String(s.clone())), + serde_yaml::Value::Sequence(a) => Value::List( + a.iter() + .map(|x| convert_yaml_value_to_nu_value(x)) + .collect(), + ), + serde_yaml::Value::Mapping(t) => { + let mut collected = Dictionary::default(); + for (k, v) in t.iter() { + match k { + serde_yaml::Value::String(k) => { + collected.add( + DataDescriptor::from(k.clone()), + convert_yaml_value_to_nu_value(v), + ); + } + _ => unimplemented!("Unknown key type"), + } + } + Value::Object(collected) + } + _ => unimplemented!("Unsupported yaml case"), + } +} + +pub fn from_yaml_string_to_value(s: String) -> Value { + let v: serde_yaml::Value = serde_yaml::from_str(&s).unwrap(); + convert_yaml_value_to_nu_value(&v) +} + +pub fn from_yaml(args: CommandArgs) -> Result { + let out = args.input; + Ok(out + .map(|a| match a { + Value::Primitive(Primitive::String(s)) => { + ReturnValue::Value(from_yaml_string_to_value(s)) + } + _ => ReturnValue::Value(Value::Primitive(Primitive::String("".to_string()))), + }) + .boxed()) +} diff --git a/src/commands/ls.rs b/src/commands/ls.rs index 8b07c90af4..c65bc2cc48 100644 --- a/src/commands/ls.rs +++ b/src/commands/ls.rs @@ -1,11 +1,18 @@ use crate::errors::ShellError; -use crate::object::{dir_entry_dict, Value}; +use crate::object::{dir_entry_dict, Primitive, Value}; use crate::prelude::*; +use std::path::{Path, PathBuf}; pub fn ls(args: CommandArgs) -> Result { let cwd = args.env.lock().unwrap().cwd().to_path_buf(); + let mut full_path = PathBuf::from(cwd); + match &args.positional.get(0) { + Some(Value::Primitive(Primitive::String(s))) => full_path.push(Path::new(s)), + _ => {} + } - let entries = std::fs::read_dir(&cwd).map_err(|e| ShellError::string(format!("{:?}", e)))?; + let entries = + std::fs::read_dir(&full_path).map_err(|e| ShellError::string(format!("{:?}", e)))?; let mut shell_entries = VecDeque::new(); diff --git a/src/commands/open.rs b/src/commands/open.rs index 4e9a17b2ee..6e009e8fc2 100644 --- a/src/commands/open.rs +++ b/src/commands/open.rs @@ -1,13 +1,17 @@ use crate::errors::ShellError; use crate::object::{Primitive, Value}; use crate::prelude::*; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; pub fn open(args: CommandArgs) -> Result { + if args.positional.len() == 0 { + return Err(ShellError::string("open requires a filepath")); + } + let cwd = args.env.lock().unwrap().cwd().to_path_buf(); let mut full_path = PathBuf::from(cwd); match &args.positional[0] { - Value::Primitive(Primitive::String(s)) => full_path.push(s), + Value::Primitive(Primitive::String(s)) => full_path.push(Path::new(s)), _ => {} } @@ -22,10 +26,24 @@ pub fn open(args: CommandArgs) -> Result { match full_path.extension() { Some(x) if x == "toml" && !open_raw => { - stream.push_back(ReturnValue::Value(crate::commands::from_toml::from_toml_string_to_value(contents))); + stream.push_back(ReturnValue::Value( + crate::commands::from_toml::from_toml_string_to_value(contents), + )); } Some(x) if x == "json" && !open_raw => { - stream.push_back(ReturnValue::Value(crate::commands::from_json::from_json_string_to_value(contents))); + stream.push_back(ReturnValue::Value( + crate::commands::from_json::from_json_string_to_value(contents), + )); + } + Some(x) if x == "yml" && !open_raw => { + stream.push_back(ReturnValue::Value( + crate::commands::from_yaml::from_yaml_string_to_value(contents), + )); + } + Some(x) if x == "yaml" && !open_raw => { + stream.push_back(ReturnValue::Value( + crate::commands::from_yaml::from_yaml_string_to_value(contents), + )); } _ => { stream.push_back(ReturnValue::Value(Value::Primitive(Primitive::String(