From 57cf805e122bf670cdc75c7f98e5adff95c01969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=BD=C3=A1dn=C3=ADk?= Date: Thu, 12 Jan 2023 00:18:06 +0200 Subject: [PATCH] Add const support for all overlay commands (#7720) --- crates/nu-parser/src/parse_keywords.rs | 40 +++++++++++++------------- tests/overlays/mod.rs | 27 +++++++++++++++++ 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/crates/nu-parser/src/parse_keywords.rs b/crates/nu-parser/src/parse_keywords.rs index ce8e5a818a..d7316df578 100644 --- a/crates/nu-parser/src/parse_keywords.rs +++ b/crates/nu-parser/src/parse_keywords.rs @@ -2315,16 +2315,16 @@ pub fn parse_overlay_new( }; let (overlay_name, _) = if let Some(expr) = call.positional_nth(0) { - if let Some(s) = expr.as_string() { - (s, expr.span) - } else { - return ( - garbage_pipeline(spans), - Some(ParseError::UnknownState( - "internal error: Module name not a string".into(), - expr.span, - )), - ); + match eval_constant(working_set, expr) { + Ok(val) => match value_as_string(val, expr.span) { + Ok(s) => (s, expr.span), + Err(err) => { + return (garbage_pipeline(spans), Some(err)); + } + }, + Err(err) => { + return (garbage_pipeline(spans), Some(err)); + } } } else { return ( @@ -2721,16 +2721,16 @@ pub fn parse_overlay_hide( }; let (overlay_name, overlay_name_span) = if let Some(expr) = call.positional_nth(0) { - if let Some(s) = expr.as_string() { - (s, expr.span) - } else { - return ( - garbage_pipeline(spans), - Some(ParseError::UnknownState( - "internal error: Module name not a string".into(), - expr.span, - )), - ); + match eval_constant(working_set, expr) { + Ok(val) => match value_as_string(val, expr.span) { + Ok(s) => (s, expr.span), + Err(err) => { + return (garbage_pipeline(spans), Some(err)); + } + }, + Err(err) => { + return (garbage_pipeline(spans), Some(err)); + } } } else { ( diff --git a/tests/overlays/mod.rs b/tests/overlays/mod.rs index caf140e437..8e520c9085 100644 --- a/tests/overlays/mod.rs +++ b/tests/overlays/mod.rs @@ -196,6 +196,33 @@ fn add_overlay_from_const_module_name_decl() { assert_eq!(actual.out, "foo"); } +#[test] +fn new_overlay_from_const_name() { + let inp = &[ + r#"const mod = 'spam'"#, + r#"overlay new $mod"#, + r#"overlay list | last"#, + ]; + + let actual = nu!(cwd: "tests/overlays", pipeline(&inp.join("; "))); + + assert_eq!(actual.out, "spam"); +} + +#[test] +fn hide_overlay_from_const_name() { + let inp = &[ + r#"const mod = 'spam'"#, + r#"overlay new $mod"#, + r#"overlay hide $mod"#, + r#"overlay list | str join ' '"#, + ]; + + let actual = nu!(cwd: "tests/overlays", pipeline(&inp.join("; "))); + + assert!(!actual.out.contains("spam")); +} + // This one tests that the `nu_repl()` loop works correctly #[test] fn add_overlay_from_file_decl_cd() {