From 78089b96dcdf6a23859978b5fabcd1e4887abda3 Mon Sep 17 00:00:00 2001 From: kubouch Date: Mon, 10 Jun 2024 21:08:48 +0300 Subject: [PATCH] Do not have global mutable engine state --- crates/nu-cli/src/reedline_config.rs | 16 ++++++++-------- crates/nu-cli/src/repl.rs | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/nu-cli/src/reedline_config.rs b/crates/nu-cli/src/reedline_config.rs index 5b857c0626..73df1e44e0 100644 --- a/crates/nu-cli/src/reedline_config.rs +++ b/crates/nu-cli/src/reedline_config.rs @@ -76,7 +76,7 @@ const DEFAULT_HELP_MENU: &str = r#" // Adds all menus to line editor pub(crate) fn add_menus( mut line_editor: Reedline, - engine_state: &mut Arc, + engine_state_ref: Arc, stack: &Stack, config: &Config, ) -> Result { @@ -84,7 +84,7 @@ pub(crate) fn add_menus( line_editor = line_editor.clear_menus(); for menu in &config.menus { - line_editor = add_menu(line_editor, menu, engine_state.clone(), stack, config)? + line_editor = add_menu(line_editor, menu, engine_state_ref.clone(), stack, config)? } // Checking if the default menus have been added from the config file @@ -94,6 +94,8 @@ pub(crate) fn add_menus( ("help_menu", DEFAULT_HELP_MENU), ]; + let mut engine_state = (*engine_state_ref).clone(); + for (name, definition) in default_menus { if !config .menus @@ -101,7 +103,7 @@ pub(crate) fn add_menus( .any(|menu| menu.name.to_expanded_string("", config) == name) { let (block, delta) = { - let mut working_set = StateWorkingSet::new(engine_state); + let mut working_set = StateWorkingSet::new(&engine_state); let output = parse( &mut working_set, Some(name), // format!("entry #{}", entry_num) @@ -112,18 +114,16 @@ pub(crate) fn add_menus( (output, working_set.render()) }; - let _ = Arc::get_mut(engine_state) - .expect("no engine state") - .merge_delta(delta); + engine_state.merge_delta(delta)?; let mut temp_stack = Stack::new().capture(); let input = PipelineData::Empty; - let res = eval_block::(engine_state, &mut temp_stack, &block, input)?; + let res = eval_block::(&engine_state, &mut temp_stack, &block, input)?; if let PipelineData::Value(value, None) = res { for menu in create_menus(&value)? { line_editor = - add_menu(line_editor, &menu, engine_state.clone(), stack, config)?; + add_menu(line_editor, &menu, engine_state_ref.clone(), stack, config)?; } } } diff --git a/crates/nu-cli/src/repl.rs b/crates/nu-cli/src/repl.rs index dd5644fb2b..d9aef32bbb 100644 --- a/crates/nu-cli/src/repl.rs +++ b/crates/nu-cli/src/repl.rs @@ -345,7 +345,7 @@ fn loop_iteration(ctx: LoopContext) -> (bool, Stack, Reedline) { use_color, ); - let mut engine_reference = Arc::new(engine_state.clone()); + let engine_reference = Arc::new(engine_state.clone()); let config = engine_state.get_config(); start_time = std::time::Instant::now(); @@ -428,7 +428,7 @@ fn loop_iteration(ctx: LoopContext) -> (bool, Stack, Reedline) { start_time = std::time::Instant::now(); trace!("adding menus"); line_editor = - add_menus(line_editor, &mut engine_reference, &stack_arc, config).unwrap_or_else(|e| { + add_menus(line_editor, engine_reference, &stack_arc, config).unwrap_or_else(|e| { report_error_new(engine_state, &e); Reedline::create() });