External vars (#1615)

* fix empty table and missing spans

* wip

* WIP

* WIP

* working version with vars

* tidying

* WIP

* Fix external quoting issue
This commit is contained in:
Jonathan Turner
2020-04-21 09:45:11 +12:00
committed by GitHub
parent 2ffb14c7d0
commit e4fdb36511
6 changed files with 126 additions and 352 deletions

View File

@ -1012,12 +1012,24 @@ fn classify_pipeline(
.name
.clone()
.map(|v| v.chars().skip(1).collect::<String>());
let name_span = name.span;
// TODO this is the same as the `else` branch below, only the name differs. Find a way
// to share this functionality.
let name_iter = std::iter::once(name);
let args = name_iter.chain(lite_cmd.args.clone().into_iter());
let args = arguments_from_string_iter(args);
let mut args = vec![];
let (name, err) = parse_arg(SyntaxShape::String, registry, &name);
let name_span = name.span;
if error.is_none() {
error = err;
}
args.push(name);
for lite_arg in &lite_cmd.args {
let (expr, err) = parse_arg(SyntaxShape::String, registry, lite_arg);
if error.is_none() {
error = err;
}
args.push(expr);
}
commands.push(ClassifiedCommand::Internal(InternalCommand {
name: "run_external".to_string(),
@ -1058,11 +1070,23 @@ fn classify_pipeline(
let trimmed = trim_quotes(&v);
expand_path(&trimmed)
});
let name_span = name.span;
let name_iter = std::iter::once(name);
let args = name_iter.chain(lite_cmd.args.clone().into_iter());
let args = arguments_from_string_iter(args);
let mut args = vec![];
let (name, err) = parse_arg(SyntaxShape::String, registry, &name);
let name_span = name.span;
if error.is_none() {
error = err;
}
args.push(name);
for lite_arg in &lite_cmd.args {
let (expr, err) = parse_arg(SyntaxShape::String, registry, lite_arg);
if error.is_none() {
error = err;
}
args.push(expr);
}
commands.push(ClassifiedCommand::Internal(InternalCommand {
name: "run_external".to_string(),
@ -1100,20 +1124,6 @@ pub fn classify_block(lite_block: &LiteBlock, registry: &dyn SignatureRegistry)
ClassifiedBlock::new(block, error)
}
/// Parse out arguments from spanned expressions
pub fn arguments_from_string_iter(
iter: impl Iterator<Item = Spanned<String>>,
) -> Vec<SpannedExpression> {
iter.map(|v| {
// TODO parse_full_column_path
SpannedExpression {
expr: Expression::string(v.to_string()),
span: v.span,
}
})
.collect::<Vec<_>>()
}
/// Easy shorthand function to create a garbage expression at the given span
pub fn garbage(span: Span) -> SpannedExpression {
SpannedExpression::new(Expression::Garbage, span)