diff --git a/crates/nu-cli/src/cli.rs b/crates/nu-cli/src/cli.rs index c634f3ed8c..f00144babf 100644 --- a/crates/nu-cli/src/cli.rs +++ b/crates/nu-cli/src/cli.rs @@ -368,6 +368,54 @@ pub fn create_default_context( Ok(context) } +pub async fn run_vec_of_pipelines( + pipelines: Vec, + redirect_stdin: bool, +) -> Result<(), Box> { + let mut syncer = crate::EnvironmentSyncer::new(); + let mut context = crate::create_default_context(&mut syncer)?; + + let _ = crate::load_plugins(&mut context); + + let cc = context.ctrl_c.clone(); + + ctrlc::set_handler(move || { + cc.store(true, Ordering::SeqCst); + }) + .expect("Error setting Ctrl-C handler"); + + if context.ctrl_c.load(Ordering::SeqCst) { + context.ctrl_c.store(false, Ordering::SeqCst); + } + + // before we start up, let's run our startup commands + if let Ok(config) = crate::data::config::config(Tag::unknown()) { + if let Some(commands) = config.get("startup") { + match commands { + Value { + value: UntaggedValue::Table(pipelines), + .. + } => { + for pipeline in pipelines { + if let Ok(pipeline_string) = pipeline.as_string() { + let _ = + run_pipeline_standalone(pipeline_string, false, &mut context).await; + } + } + } + _ => { + println!("warning: expected a table of pipeline strings as startup commands"); + } + } + } + } + + for pipeline in pipelines { + run_pipeline_standalone(pipeline, redirect_stdin, &mut context).await?; + } + Ok(()) +} + pub async fn run_pipeline_standalone( pipeline: String, redirect_stdin: bool, diff --git a/crates/nu-cli/src/lib.rs b/crates/nu-cli/src/lib.rs index 23c070f9a3..6c6ce62d8c 100644 --- a/crates/nu-cli/src/lib.rs +++ b/crates/nu-cli/src/lib.rs @@ -28,7 +28,9 @@ mod shell; mod stream; mod utils; -pub use crate::cli::{cli, create_default_context, load_plugins, run_pipeline_standalone}; +pub use crate::cli::{ + cli, create_default_context, load_plugins, run_pipeline_standalone, run_vec_of_pipelines, +}; pub use crate::data::dict::TaggedListBuilder; pub use crate::data::primitive; pub use crate::data::value; diff --git a/src/main.rs b/src/main.rs index 1f183b2167..58ac6d5515 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,6 @@ use log::LevelFilter; use std::error::Error; use std::fs::File; use std::io::{prelude::*, BufReader}; -use std::sync::atomic::Ordering; fn main() -> Result<(), Box> { let matches = App::new("nushell") @@ -89,28 +88,11 @@ fn main() -> Result<(), Box> { match matches.values_of("commands") { None => {} Some(values) => { - let mut syncer = nu_cli::EnvironmentSyncer::new(); - let mut context = nu_cli::create_default_context(&mut syncer)?; - - let _ = nu_cli::load_plugins(&mut context); - - let cc = context.ctrl_c.clone(); - - ctrlc::set_handler(move || { - cc.store(true, Ordering::SeqCst); - }) - .expect("Error setting Ctrl-C handler"); - - if context.ctrl_c.load(Ordering::SeqCst) { - context.ctrl_c.store(false, Ordering::SeqCst); - } - for item in values { - futures::executor::block_on(nu_cli::run_pipeline_standalone( - item.into(), - matches.is_present("stdin"), - &mut context, - ))?; - } + let pipelines: Vec = values.map(|x| x.to_string()).collect(); + futures::executor::block_on(nu_cli::run_vec_of_pipelines( + pipelines, + matches.is_present("stdin"), + ))?; return Ok(()); } } @@ -119,31 +101,25 @@ fn main() -> Result<(), Box> { Some(script) => { let file = File::open(script)?; let reader = BufReader::new(file); - let mut syncer = nu_cli::EnvironmentSyncer::new(); - let mut context = nu_cli::create_default_context(&mut syncer)?; + let pipelines: Vec = reader + .lines() + .filter_map(|x| { + if let Ok(x) = x { + if !x.starts_with('#') { + Some(x) + } else { + None + } + } else { + None + } + }) + .collect(); - let _ = nu_cli::load_plugins(&mut context); - - let cc = context.ctrl_c.clone(); - - ctrlc::set_handler(move || { - cc.store(true, Ordering::SeqCst); - }) - .expect("Error setting Ctrl-C handler"); - - if context.ctrl_c.load(Ordering::SeqCst) { - context.ctrl_c.store(false, Ordering::SeqCst); - } - for line in reader.lines() { - let line = line?; - if !line.starts_with('#') { - futures::executor::block_on(nu_cli::run_pipeline_standalone( - line, - matches.is_present("stdin"), - &mut context, - ))?; - } - } + futures::executor::block_on(nu_cli::run_vec_of_pipelines( + pipelines, + matches.is_present("stdin"), + ))?; return Ok(()); }