From fce6146576dda0cbce4f091317176bb8b67fed07 Mon Sep 17 00:00:00 2001 From: Ian Manske Date: Fri, 11 Oct 2024 09:40:32 -0700 Subject: [PATCH] Refactor config updates (#13802) # Description This PR standardizes updates to the config through a new `UpdateFromValue` trait. For now, this trait is private in case we need to make changes to it. Note that this PR adds some additional `ShellError` cases to create standard error messages for config errors. A follow-up PR will move usages of the old error cases to these new ones. This PR also uses `Type::custom` in lots of places (e.g., for string enums). Not sure if this is something we want to encourage. # User-Facing Changes Should be none. --- crates/nu-cli/src/reedline_config.rs | 414 +++++----- crates/nu-cmd-base/src/hook.rs | 48 +- crates/nu-color-config/src/style_computer.rs | 15 +- crates/nu-command/src/network/url/join.rs | 12 +- crates/nu-protocol/src/config/completer.rs | 83 -- crates/nu-protocol/src/config/completions.rs | 151 ++++ .../nu-protocol/src/config/datetime_format.rs | 31 + .../nu-protocol/src/config/display_errors.rs | 23 + crates/nu-protocol/src/config/error.rs | 85 ++ crates/nu-protocol/src/config/filesize.rs | 23 + crates/nu-protocol/src/config/helper.rs | 277 ++++--- crates/nu-protocol/src/config/history.rs | 35 +- crates/nu-protocol/src/config/hooks.rs | 59 +- crates/nu-protocol/src/config/ls.rs | 23 + crates/nu-protocol/src/config/mod.rs | 731 +++--------------- crates/nu-protocol/src/config/output.rs | 10 +- crates/nu-protocol/src/config/plugin_gc.rs | 164 ++-- crates/nu-protocol/src/config/prelude.rs | 3 +- crates/nu-protocol/src/config/reedline.rs | 126 +-- crates/nu-protocol/src/config/rm.rs | 22 + .../src/config/shell_integration.rs | 28 + crates/nu-protocol/src/config/table.rs | 266 ++++--- crates/nu-protocol/src/engine/stack.rs | 13 +- crates/nu-protocol/src/errors/cli_error.rs | 14 +- crates/nu-protocol/src/errors/config_error.rs | 56 ++ crates/nu-protocol/src/errors/mod.rs | 2 + crates/nu-protocol/src/errors/shell_error.rs | 67 +- crates/nu-protocol/src/ty.rs | 4 + crates/nu-protocol/tests/into_config.rs | 12 +- src/test_bins.rs | 17 +- tests/hooks/mod.rs | 12 +- tests/repl/test_config.rs | 4 +- 32 files changed, 1343 insertions(+), 1487 deletions(-) delete mode 100644 crates/nu-protocol/src/config/completer.rs create mode 100644 crates/nu-protocol/src/config/completions.rs create mode 100644 crates/nu-protocol/src/config/error.rs create mode 100644 crates/nu-protocol/src/errors/config_error.rs diff --git a/crates/nu-cli/src/reedline_config.rs b/crates/nu-cli/src/reedline_config.rs index 48140b4427..80ae28b103 100644 --- a/crates/nu-cli/src/reedline_config.rs +++ b/crates/nu-cli/src/reedline_config.rs @@ -5,11 +5,10 @@ use nu_color_config::{color_record_to_nustyle, lookup_ansi_color_style}; use nu_engine::eval_block; use nu_parser::parse; use nu_protocol::{ - create_menus, debugger::WithoutDebug, engine::{EngineState, Stack, StateWorkingSet}, - extract_value, Config, EditBindings, ParsedKeybinding, ParsedMenu, PipelineData, Record, - ShellError, Span, Value, + extract_value, Config, EditBindings, FromValue, ParsedKeybinding, ParsedMenu, PipelineData, + Record, ShellError, Span, Type, Value, }; use reedline::{ default_emacs_keybindings, default_vi_insert_keybindings, default_vi_normal_keybindings, @@ -173,15 +172,13 @@ pub(crate) fn add_menus( for res in menu_eval_results.into_iter() { if let PipelineData::Value(value, None) = res { - for menu in create_menus(&value)? { - line_editor = add_menu( - line_editor, - &menu, - new_engine_state_ref.clone(), - stack, - config.clone(), - )?; - } + line_editor = add_menu( + line_editor, + &ParsedMenu::from_value(value)?, + new_engine_state_ref.clone(), + stack, + config.clone(), + )?; } } @@ -204,22 +201,22 @@ fn add_menu( "list" => add_list_menu(line_editor, menu, engine_state, stack, config), "ide" => add_ide_menu(line_editor, menu, engine_state, stack, config), "description" => add_description_menu(line_editor, menu, engine_state, stack, config), - _ => Err(ShellError::UnsupportedConfigValue { - expected: "columnar, list, ide or description".to_string(), - value: menu.r#type.to_abbreviated_string(&config), - span: menu.r#type.span(), + str => Err(ShellError::InvalidValue { + valid: "'columnar', 'list', 'ide', or 'description'".into(), + actual: format!("'{str}'"), + span, }), } } else { - Err(ShellError::UnsupportedConfigValue { - expected: "only record type".to_string(), - value: menu.r#type.to_abbreviated_string(&config), - span: menu.r#type.span(), + Err(ShellError::RuntimeTypeMismatch { + expected: Type::record(), + actual: menu.r#type.get_type(), + span, }) } } -fn get_style(record: &Record, name: &str, span: Span) -> Option