From 8f07f40f224e2e98f693c7f779a3732d42713a35 Mon Sep 17 00:00:00 2001 From: Fernando Herrera Date: Sun, 12 Sep 2021 16:34:43 +0100 Subject: [PATCH] external call --- crates/nu-engine/src/eval.rs | 33 ++++++++++++++++++- crates/nu-protocol/src/engine/engine_state.rs | 2 +- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/crates/nu-engine/src/eval.rs b/crates/nu-engine/src/eval.rs index b3da15c87..e7d40894f 100644 --- a/crates/nu-engine/src/eval.rs +++ b/crates/nu-engine/src/eval.rs @@ -1,3 +1,5 @@ +use std::process::Command; + use nu_protocol::ast::{Block, Call, Expr, Expression, Operator, Statement}; use nu_protocol::engine::EvaluationContext; use nu_protocol::{Range, ShellError, Span, Value}; @@ -68,6 +70,33 @@ fn eval_call(context: &EvaluationContext, call: &Call, input: Value) -> Result, + expr: &Expression, +) -> Result { + let state = context.engine_state.borrow(); + let name = state.get_span_contents(command_span); + let cmd = std::str::from_utf8(name).unwrap(); + + let args = spans + .iter() + .map(|span| { + let val = state.get_span_contents(span); + std::str::from_utf8(val).unwrap() + }) + .collect::>(); + + let output = Command::new(cmd).args(args).output().unwrap(); + + println!("{:?}", output); + let test = output.stdout; + println!("{:?}", test); + + Err(ShellError::ExternalNotSupported(expr.span)) +} + pub fn eval_expression( context: &EvaluationContext, expr: &Expression, @@ -137,7 +166,9 @@ pub fn eval_expression( } Expr::RowCondition(_, expr) => eval_expression(context, expr), Expr::Call(call) => eval_call(context, call, Value::nothing()), - Expr::ExternalCall(_, _) => Err(ShellError::ExternalNotSupported(expr.span)), + Expr::ExternalCall(command_span, spans) => { + eval_external(context, command_span, spans, expr) + } Expr::Operator(_) => Ok(Value::Nothing { span: expr.span }), Expr::BinaryOp(lhs, op, rhs) => { let op_span = op.span; diff --git a/crates/nu-protocol/src/engine/engine_state.rs b/crates/nu-protocol/src/engine/engine_state.rs index a9c307fc4..771bac24b 100644 --- a/crates/nu-protocol/src/engine/engine_state.rs +++ b/crates/nu-protocol/src/engine/engine_state.rs @@ -137,7 +137,7 @@ impl EngineState { output } - pub fn get_span_contents(&self, span: Span) -> &[u8] { + pub fn get_span_contents(&self, span: &Span) -> &[u8] { &self.file_contents[span.start..span.end] }