Skip to content

Commit 3c83ea7

Browse files
authored
Allow variables in columns of table literals (nushell#16669)
Fixes nushell#15333 This should bring things more in line with how records work. Turns out it was already be parsed properly, it was just the type check code causing problems. If a column name isn't a literal then we just don't add that column to type at parse-time. +3 tests ## Release notes summary - What our users need to know ### Table literal columns support variables Table literals can now have variables in the column names list. For example, this is now allowed: ```nushell let column_name = 'column0' [[ $column_name column1 ]; [ foo bar ] [ baz car ] [ far fit ]] # => ╭───┬─────────┬─────────╮ # => │ # │ column0 │ column1 │ # => ├───┼─────────┼─────────┤ # => │ 0 │ foo │ bar │ # => │ 1 │ baz │ car │ # => │ 2 │ far │ fit │ # => ╰───┴─────────┴─────────╯ ``` <details> <summary>ANSI code block</summary> ```ansi �[38;5;6m> �[1;36mlet �[0m�[35mcolumn_name �[39m= �[32m'column0'�[0m �[1;34m[[ �[0m�[35m$column_name �[32mcolumn1 �[1;34m];�[0m �[1;34m[ �[0m�[32mfoo bar �[1;34m]�[0m �[1;34m[ �[0m�[32mbaz car �[1;34m]�[0m �[1;34m[ �[0m�[32mfar fit �[1;34m]]�[0m �[39m╭───┬─────────┬─────────╮�[0m �[39m│ �[1;32m# �[0m�[39m│ �[1;32mcolumn0 �[0m�[39m│ �[1;32mcolumn1 �[0m�[39m│�[0m �[39m├───┼─────────┼─────────┤�[0m �[39m│ �[1;32m0 �[0m�[39m│ foo │ bar │�[0m �[39m│ �[1;32m1 �[0m�[39m│ baz │ car │�[0m �[39m│ �[1;32m2 �[0m�[39m│ far │ fit │�[0m �[39m╰───┴─────────┴─────────╯�[0m ``` </details>
1 parent f102448 commit 3c83ea7

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

crates/nu-parser/src/parser.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4806,12 +4806,13 @@ fn table_type(head: &[Expression], rows: &[Vec<Expression>]) -> (Type, Vec<Parse
48064806
let mut ty = head
48074807
.iter()
48084808
.rev()
4809-
.map(|expr| {
4810-
if let Some(str) = expr.as_string() {
4811-
str
4812-
} else {
4809+
// Include only known column names in type
4810+
.filter_map(|expr| {
4811+
if !Type::String.is_subtype_of(&expr.ty) {
48134812
errors.push(mk_error(expr.span));
4814-
String::from("{ column }")
4813+
None
4814+
} else {
4815+
expr.as_string()
48154816
}
48164817
})
48174818
.map(|title| (title, mk_ty()))

tests/repl/test_parser.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,3 +1051,39 @@ fn redefine_def_should_not_panic() -> TestResult {
10511051
"Missing required positional argument.",
10521052
)
10531053
}
1054+
1055+
#[test]
1056+
fn table_literal_column_var() -> TestResult {
1057+
run_test(
1058+
r#"
1059+
let column_name = 'column0'
1060+
let tbl = [[ $column_name column1 ]; [ foo bar ] [ baz car ] [ far fit ]]
1061+
$tbl.column0.0
1062+
"#,
1063+
"foo",
1064+
)
1065+
}
1066+
1067+
#[test]
1068+
fn table_literal_column_var_parse_err() -> TestResult {
1069+
fail_test(
1070+
r#"
1071+
let column_name = {a: 123}
1072+
let tbl = [[ $column_name column1 ]; [ foo bar ] [ baz car ] [ far fit ]]
1073+
$tbl.column0.0
1074+
"#,
1075+
"must be a string",
1076+
)
1077+
}
1078+
1079+
#[test]
1080+
fn table_literal_column_var_shell_err() -> TestResult {
1081+
fail_test(
1082+
r#"
1083+
let column_name = echo {a: 123}
1084+
let tbl = [[ $column_name column1 ]; [ foo bar ] [ baz car ] [ far fit ]]
1085+
$tbl.column0.0
1086+
"#,
1087+
"can't convert",
1088+
)
1089+
}

0 commit comments

Comments
 (0)