use log::info; use miette::Result; use nu_engine::{convert_env_values, eval_block}; use nu_parser::parse; use nu_protocol::{ debugger::WithoutDebug, engine::{EngineState, Stack, StateWorkingSet}, report_error, PipelineData, Spanned, Value, }; /// Run a command (or commands) given to us by the user pub fn evaluate_commands( commands: &Spanned, engine_state: &mut EngineState, stack: &mut Stack, input: PipelineData, table_mode: Option, no_newline: bool, ) -> Result> { // Translate environment variables from Strings to Values if let Some(e) = convert_env_values(engine_state, stack) { let working_set = StateWorkingSet::new(engine_state); report_error(&working_set, &e); std::process::exit(1); } // Parse the source code let (block, delta) = { if let Some(ref t_mode) = table_mode { let mut config = engine_state.get_config().clone(); config.table_mode = t_mode.coerce_str()?.parse().unwrap_or_default(); engine_state.set_config(config); } let mut working_set = StateWorkingSet::new(engine_state); let output = parse(&mut working_set, None, commands.item.as_bytes(), false); if let Some(warning) = working_set.parse_warnings.first() { report_error(&working_set, warning); } if let Some(err) = working_set.parse_errors.first() { report_error(&working_set, err); std::process::exit(1); } (output, working_set.render()) }; // Update permanent state if let Err(err) = engine_state.merge_delta(delta) { let working_set = StateWorkingSet::new(engine_state); report_error(&working_set, &err); } // Run the block let exit_code = match eval_block::(engine_state, stack, &block, input) { Ok(pipeline_data) => { let mut config = engine_state.get_config().clone(); if let Some(t_mode) = table_mode { config.table_mode = t_mode.coerce_str()?.parse().unwrap_or_default(); } crate::eval_file::print_table_or_error( engine_state, stack, pipeline_data, &mut config, no_newline, ) } Err(err) => { let working_set = StateWorkingSet::new(engine_state); report_error(&working_set, &err); std::process::exit(1); } }; info!("evaluate {}:{}:{}", file!(), line!(), column!()); Ok(exit_code) }