nushell/crates
Kira ae0e13733d
Fix parsing record values containing colons (#13413)
This PR is an attempt to fix #8257 and fix #10985 (which is
duplicate-ish)

# Description
The parser currently doesn't know how to deal with colons appearing
while lexing whitespace-terminated tokens specifying a record value.
Most notably, this means you can't use datetime literals in record value
position (and as a consequence, `| to nuon | from nuon` roundtrips can
fail), but it also means that bare words containing colons cause a
non-useful error message.

![image](https://github.com/user-attachments/assets/f04a8417-ee18-44e7-90eb-a0ecef943a0f)

`parser::parse_record` calls `lex::lex` with the `:` colon character in
the `special_tokens` argument. This allows colons to terminate record
keys, but as a side effect, it also causes colons to terminate record
*values*. I added a new function `lex::lex_n_tokens`, which allows the
caller to drive the lexing process more explicitly, and used it in
`parser::parse_record` to let colons terminate record keys while not
giving them special treatment when appearing in record values.

This PR description previously said: *Another approach suggested in one
of the issues was to support an additional datetime literal format that
doesn't require colons. I like that that wouldn't require new
`lex::lex_internal` behaviour, but an advantage of my approach is that
it also newly allows for string record values given as bare words
containing colons. I think this eliminates another possible source of
confusion.* It was determined that this is undesirable, and in the
current state of this PR, bare word record values with colons are
rejected explicitly. The better error message is still a win.

# User-Facing Changes
In addition to the above, this PR also disables the use of "special"
(non-item) tokens in record key and value position, and the use of a
single bare `:` as a record key.

Examples of behaviour *before* this PR:
```nu
{ a: b } # Valid, same as { 'a': 'b' }
{ a: b:c } # Error: expected ':'
{ a: 2024-08-13T22:11:09 } # Error: expected ':'
{ :: 1 } # Valid, same as { ':': 1 }
{ ;: 1 } # Valid, same as { ';': 1 }
{ a: || } # Valid, same as { 'a': '||' }
```

Examples of behaviour *after* this PR:
```nu
{ a: b } # (Unchanged) Valid, same as { 'a': 'b' }
{ a: b:c } # Error: colon in bare word specifying record value
{ a: 2024-08-13T22:11:09 } # Valid, same as { a: (2024-08-13T22:11:09) }
{ :: 1 } # Error: colon in bare word specifying record key
{ ;: 1 } # Error: expected item in record key position
{ a: || } # Error: expected item in record value position
```

# Tests + Formatting
I added tests, but I'm not sure if they're sufficient and in the right
place.

# After Submitting
I don't think documentation changes are needed for this, but please let
me know if you disagree.
2024-08-28 22:53:56 +02:00
..
nu_plugin_custom_values Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu_plugin_example Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu_plugin_formats Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu_plugin_gstat Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu_plugin_inc Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu_plugin_nu_example Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu_plugin_polars Added polars commands for converting string columns to integer and decimal columns (#13711) 2024-08-28 07:54:31 -05:00
nu_plugin_python Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu_plugin_query Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu_plugin_stress_internals Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu-cli Use right options in custom completions (#13698) 2024-08-26 12:14:57 -05:00
nu-cmd-base Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-cmd-extra encode/decode for multiple alphabets (#13428) 2024-08-23 11:18:51 -05:00
nu-cmd-lang Bump shadow-rs from 0.31.1 to 0.33.0 (#13713) 2024-08-28 13:05:11 +00:00
nu-cmd-plugin Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu-color-config Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-command Remove str deunicode (#13693) 2024-08-28 07:58:38 -05:00
nu-derive-value Use heck instead of convert_case for nu-derive-value (#13708) 2024-08-28 08:02:25 -05:00
nu-engine doc: fix broken doc links (#13644) 2024-08-23 21:17:44 +02:00
nu-explore Remove unnecessary sort in explore search fn (#13690) 2024-08-25 20:13:05 +02:00
nu-glob Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-json Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-lsp Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu-parser Fix parsing record values containing colons (#13413) 2024-08-28 22:53:56 +02:00
nu-path Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-plugin Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu-plugin-core Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu-plugin-engine doc: fix broken doc links (#13644) 2024-08-23 21:17:44 +02:00
nu-plugin-protocol Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-plugin-test-support Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
nu-pretty-hex Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-protocol Use heck instead of convert_case for nu-derive-value (#13708) 2024-08-28 08:02:25 -05:00
nu-std Respect user-defined $env.NU_LOG_FORMAT and $env.NU_LOG_DATE_FORMAT (#13692) 2024-08-28 07:57:43 -05:00
nu-system Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-table [DRAFT] Check fix for emojie, wrap issues (#13430) 2024-08-23 17:35:42 -05:00
nu-term-grid Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02:00
nu-test-support Respect user-defined $env.NU_LOG_FORMAT and $env.NU_LOG_DATE_FORMAT (#13692) 2024-08-28 07:57:43 -05:00
nu-utils Remove system-clipboard from the default build (#13694) 2024-08-28 22:19:13 +02:00
nuon Bump version to 0.97.2 (#13666) 2024-08-22 11:36:32 +02: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.