Merge pull request #48 from jonathandturner/master

Add row/col split and fix units parsing
This commit is contained in:
Jonathan Turner 2019-06-01 05:24:24 +12:00 committed by GitHub
commit 855eb197aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 603 additions and 473 deletions

View File

@ -52,7 +52,8 @@ pub async fn cli() -> Result<(), Box<Error>> {
command("from-json", from_json::from_json), command("from-json", from_json::from_json),
command("open", open::open), command("open", open::open),
command("column", column::column), 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("reject", reject::reject),
command("select", select::select), command("select", select::select),
command("to-array", to_array::to_array), command("to-array", to_array::to_array),

View File

@ -12,7 +12,8 @@ crate mod select;
crate mod size; crate mod size;
crate mod skip; crate mod skip;
crate mod sort_by; crate mod sort_by;
crate mod split; crate mod col_split;
crate mod row_split;
crate mod take; crate mod take;
crate mod to_array; crate mod to_array;
crate mod to_json; crate mod to_json;

View File

@ -5,7 +5,7 @@ use log::debug;
// TODO: "Amount remaining" wrapper // TODO: "Amount remaining" wrapper
pub fn split(args: CommandArgs) -> Result<OutputStream, ShellError> { pub fn col_split(args: CommandArgs) -> Result<OutputStream, ShellError> {
//let splitter = args.args[0].as_string()?; //let splitter = args.args[0].as_string()?;
let input = args.input; let input = args.input;
let args = args.args; let args = args.args;
@ -13,7 +13,7 @@ pub fn split(args: CommandArgs) -> Result<OutputStream, ShellError> {
Ok(input Ok(input
.map(move |v| match v { .map(move |v| match v {
Value::Primitive(Primitive::String(s)) => { 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); debug!("splitting with {:?}", splitter);
let split_result: Vec<_> = s.split(&splitter).filter(|s| s.trim() != "").collect(); let split_result: Vec<_> = s.split(&splitter).filter(|s| s.trim() != "").collect();

37
src/commands/row_split.rs Normal file
View File

@ -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<OutputStream, ShellError> {
//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())
}

View File

@ -23,7 +23,7 @@ crate enum TopToken {
DQString, DQString,
#[regex = "-?[0-9]+[A-Za-z]+"] #[regex = "-?[0-9]+[A-Za-z]+"]
Size, UnitsNum,
#[regex = r"\$"] #[regex = r"\$"]
#[callback = "start_variable"] #[callback = "start_variable"]
@ -88,7 +88,7 @@ impl TopToken {
Num => Token::Num, Num => Token::Num,
SQString => Token::SQString, SQString => Token::SQString,
DQString => Token::DQString, DQString => Token::DQString,
Size => Token::Size, UnitsNum => Token::UnitsNum,
Dollar => Token::Dollar, Dollar => Token::Dollar,
Bare => Token::Bare, Bare => Token::Bare,
Pipe => Token::Pipe, Pipe => Token::Pipe,
@ -344,7 +344,7 @@ pub enum Token {
Num, Num,
SQString, SQString,
DQString, DQString,
Size, UnitsNum,
Dollar, Dollar,
Bare, Bare,
Pipe, Pipe,

View File

@ -4,6 +4,7 @@ use std::str::FromStr;
use crate::parser::ast::*; use crate::parser::ast::*;
use crate::prelude::*; use crate::prelude::*;
use crate::parser::lexer::{SpannedToken, Token}; use crate::parser::lexer::{SpannedToken, Token};
use byte_unit::Byte;
grammar<'input>; grammar<'input>;
@ -21,7 +22,7 @@ Command: ParsedCommand = {
Leaf: Expression = { Leaf: Expression = {
<String> => Expression::Leaf(Leaf::String(<>)), <String> => Expression::Leaf(Leaf::String(<>)),
<Int> => Expression::Leaf(Leaf::Int(<>)), <Int> => Expression::Leaf(Leaf::Int(<>)),
//<Size> => Expression::Leaf(Leaf::Int(<>)), <UnitsNum> => Expression::Leaf(Leaf::Int(<>)),
<Variable> => Expression::VariableReference(<>), <Variable> => Expression::VariableReference(<>),
} }
@ -100,6 +101,10 @@ Int: i64 = {
<"num"> => i64::from_str(<>.as_slice()).unwrap() <"num"> => i64::from_str(<>.as_slice()).unwrap()
} }
UnitsNum: i64 = {
<"unitsnum"> => Byte::from_string(<>.as_slice()).unwrap().get_bytes() as i64
}
extern { extern {
type Location = usize; type Location = usize;
type Error = ShellError; type Error = ShellError;
@ -126,6 +131,6 @@ extern {
"bare" => SpannedToken { token: Token::Bare, .. }, "bare" => SpannedToken { token: Token::Bare, .. },
"dqstring" => SpannedToken { token: Token::DQString, .. }, "dqstring" => SpannedToken { token: Token::DQString, .. },
"sqstring" => SpannedToken { token: Token::SQString, .. }, "sqstring" => SpannedToken { token: Token::SQString, .. },
"size" => SpannedToken { token: Token::Size, .. }, "unitsnum" => SpannedToken { token: Token::UnitsNum, .. },
} }
} }

File diff suppressed because it is too large Load Diff