nushell/crates
Yash Thakur 0303d709e6
Spread operator in record literals (#11144)
Goes towards implementing #10598, which asks for a spread operator in
lists, in records, and when calling commands (continuation of #11006,
which only implements it in lists)

# Description
This PR is for adding a spread operator that can be used when building
records. Additional functionality can be added later.

Changes:

- Previously, the `Expr::Record` variant held `(Expression, Expression)`
pairs. It now holds instances of an enum `RecordItem` (the name isn't
amazing) that allows either a key-value mapping or a spread operator.
- `...` will be treated as the spread operator when it appears before
`$`, `{`, or `(` inside records (no whitespace allowed in between) (not
implemented yet)
- The error message for duplicate columns now includes the column name
itself, because if two spread records are involved in such an error, you
can't tell which field was duplicated from the spans alone

`...` will still be treated as a normal string outside records, and even
in records, it is not treated as a spread operator when not followed
immediately by a `$`, `{`, or `(`.

# User-Facing Changes
Users will be able to use `...` when building records.

```
> let rec = { x: 1, ...{ a: 2 } }
> $rec
╭───┬───╮
│ x │ 1 │
│ a │ 2 │
╰───┴───╯
> { foo: bar, ...$rec, baz: blah }
╭─────┬──────╮
│ foo │ bar  │
│ x   │ 1    │
│ a   │ 2    │
│ baz │ blah │
╰─────┴──────╯
```
If you want to update a field of a record, you'll have to use `merge`
instead:
```
> { ...$rec, x: 5 }
Error: nu:🐚:column_defined_twice

  × Record field or table column used twice: x
   ╭─[entry #2:1:1]
 1 │  { ...$rec, x: 5 }
   ·       ──┬─  ┬
   ·         │   ╰── field redefined here
   ·         ╰── field first defined here
   ╰────
> $rec | merge { x: 5 }
╭───┬───╮
│ x │ 5 │
│ a │ 2 │
╰───┴───╯
```

# Tests + Formatting

# After Submitting
2023-11-29 18:31:31 +01:00
..
nu_plugin_custom_values Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu_plugin_example Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu_plugin_formats Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu_plugin_gstat Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu_plugin_inc Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu_plugin_python remove vectorize_over_list from python plugin (#9905) 2023-08-03 16:46:48 +02:00
nu_plugin_query Move more commands to opaque Record type (#11122) 2023-11-22 23:48:48 +01:00
nu-cli Spread operator in record literals (#11144) 2023-11-29 18:31:31 +01:00
nu-cmd-base Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-cmd-dataframe Revert "Adding support for Polars structs" (#11171) 2023-11-29 16:33:27 +01:00
nu-cmd-extra Move more commands to opaque Record type (#11122) 2023-11-22 23:48:48 +01:00
nu-cmd-lang Move more commands to opaque Record type (#11122) 2023-11-22 23:48:48 +01:00
nu-color-config add shape ExternalResolved to show found externals via syntax highlighting in the repl (#11135) 2023-11-25 09:42:05 -06:00
nu-command Spread operator in record literals (#11144) 2023-11-29 18:31:31 +01:00
nu-engine Spread operator in record literals (#11144) 2023-11-29 18:31:31 +01:00
nu-explore Convert more ShellError variants to named fields (#11173) 2023-11-28 06:43:51 -06:00
nu-glob Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-json Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-lsp Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-parser Spread operator in record literals (#11144) 2023-11-29 18:31:31 +01:00
nu-path Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-plugin Convert PluginFailedToDecode to named fields (#11126) 2023-11-22 12:56:04 +01:00
nu-pretty-hex Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-protocol Spread operator in record literals (#11144) 2023-11-29 18:31:31 +01:00
nu-std fix the link to the nu_scripts in std clip deprecation (#11150) 2023-11-24 19:03:07 +01:00
nu-system Bump procfs to 0.16.0 (#11115) 2023-11-20 21:22:35 +01:00
nu-table Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-term-grid Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-test-support Bump version to 0.87.2 (#11114) 2023-11-20 20:31:10 +01:00
nu-utils add shape ExternalResolved to show found externals via syntax highlighting in the repl (#11135) 2023-11-25 09:42:05 -06:00
README.md Remove old nushell/merge engine-q 2022-02-07 14:54:06 -05:00

Nushell core libraries and plugins

These sub-crates form both the foundation for Nu and a set of plugins which extend Nu with additional functionality.

Foundational libraries are split into two kinds of crates:

  • Core crates - those crates that work together to build the Nushell language engine
  • Support crates - a set of crates that support the engine with additional features like JSON support, ANSI support, and more.

Plugins are likewise also split into two types:

  • Core plugins - plugins that provide part of the default experience of Nu, including access to the system properties, processes, and web-connectivity features.
  • Extra plugins - these plugins run a wide range of different capabilities like working with different file types, charting, viewing binary data, and more.