diff --git a/src/cli.rs b/src/cli.rs index 18f25885df..98fa7075ba 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -52,7 +52,8 @@ pub async fn cli() -> Result<(), Box> { command("from-json", from_json::from_json), command("open", open::open), command("column", column::column), - command("split", split::split), + command("column-split", col_split::col_split), + command("row-split", row_split::row_split), command("reject", reject::reject), command("select", select::select), command("to-array", to_array::to_array), diff --git a/src/commands.rs b/src/commands.rs index 06829b48a8..ca345a7510 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -12,7 +12,8 @@ crate mod select; crate mod size; crate mod skip; crate mod sort_by; -crate mod split; +crate mod col_split; +crate mod row_split; crate mod take; crate mod to_array; crate mod to_json; diff --git a/src/commands/split.rs b/src/commands/col_split.rs similarity index 93% rename from src/commands/split.rs rename to src/commands/col_split.rs index 49881a2d92..f0badee0fd 100644 --- a/src/commands/split.rs +++ b/src/commands/col_split.rs @@ -5,7 +5,7 @@ use log::debug; // TODO: "Amount remaining" wrapper -pub fn split(args: CommandArgs) -> Result { +pub fn col_split(args: CommandArgs) -> Result { //let splitter = args.args[0].as_string()?; let input = args.input; let args = args.args; @@ -13,7 +13,7 @@ pub fn split(args: CommandArgs) -> Result { Ok(input .map(move |v| match v { Value::Primitive(Primitive::String(s)) => { - let splitter = args[0].as_string().unwrap(); + let splitter = args[0].as_string().unwrap().replace("\\n", "\n"); debug!("splitting with {:?}", splitter); let split_result: Vec<_> = s.split(&splitter).filter(|s| s.trim() != "").collect(); diff --git a/src/commands/row_split.rs b/src/commands/row_split.rs new file mode 100644 index 0000000000..a765295954 --- /dev/null +++ b/src/commands/row_split.rs @@ -0,0 +1,37 @@ +use crate::errors::ShellError; +use crate::object::{Primitive, Value}; +use crate::prelude::*; +use log::debug; + +// TODO: "Amount remaining" wrapper + +pub fn row_split(args: CommandArgs) -> Result { + //let splitter = args.args[0].as_string()?; + let input = args.input; + let args = args.args; + + let stream = input + .map(move |v| match v { + Value::Primitive(Primitive::String(s)) => { + let splitter = args[0].as_string().unwrap().replace("\\n", "\n"); + debug!("splitting with {:?}", splitter); + let split_result: Vec<_> = s.split(&splitter).filter(|s| s.trim() != "").collect(); + + debug!("split result = {:?}", split_result); + + let mut result = VecDeque::new(); + for s in split_result { + result.push_back(ReturnValue::Value(Value::Primitive(Primitive::String(s.to_string())))); + } + result + } + _ => { + let mut result = VecDeque::new(); + result.push_back(ReturnValue::Value(Value::Object(crate::object::Dictionary::default()))); + result + } + }) + .flatten(); + + Ok(stream.boxed()) +} diff --git a/src/object/base.rs b/src/object/base.rs index d7086495c7..ce014bc3c9 100644 --- a/src/object/base.rs +++ b/src/object/base.rs @@ -183,7 +183,7 @@ impl Value { crate fn compare(&self, operator: ast::Operator, other: &Value) -> Option { match operator { - ast::Operator::Equal | ast::Operator::NotEqual => unimplemented!(), + //ast::Operator::Equal | ast::Operator::NotEqual => unimplemented!(), _ => { let coerced = coerce_compare(self, other)?; let ordering = coerced.compare();