nushell/crates
Yash Thakur d5946a9667
Parse time type checking for range (#13595)
# Description

As part of fixing https://github.com/nushell/nushell/issues/13586, this
PR checks the types of the operands when creating a range. Stuff like
`0..(glob .)` will be rejected at parse time. Additionally, `0..$x` will
be treated as a range and rejected if `x` is not defined, rather than
being treated as a string. A separate PR will need to be made to do
reject streams at runtime, so that stuff like `0..(open /dev/random)`
doesn't hang.

Internally, this PR adds a `ParseError::UnsupportedOperationTernary`
variant, for when you have a range like `1..2..(glob .)`.

# User-Facing Changes

Users will now receive an error if any of the operands in the ranges
they construct have types that aren't compatible with `Type::Number`.

Additionally, if a piece of code looks like a range but some parse error
is encountered while parsing it, that piece of code will still be
treated as a range and the user will be shown the parse error. This
means that a piece of code like `0..$x` will be treated as a range no
matter what. Previously, if `x` weren't the expression would've been
treated as a string `"0..$x"`. I feel like it makes the language less
complicated if we make it less context-sensitive.

Here's an example of the error you get:
```
> 0..(glob .)
Error: nu::parser::unsupported_operation

  × range is not supported between int and any.
   ╭─[entry #1:1:1]
 1 │ 0..(glob .)
   · ─────┬─────┬┬
   ·      │     │╰── any
   ·      │     ╰── int
   ·      ╰── doesn't support these values
   ╰────
```

And as an image:

![image](https://github.com/user-attachments/assets/5c76168d-27db-481b-b541-861dac899dbf)

Note: I made the operands themselves (above, `(glob .)`) be garbage,
rather than the `..` operator itself. This doesn't match the behavior of
the math operators (if you do `1 + "foo"`, `+` gets highlighted red).
This is because with ranges, the range operators aren't `Expression`s
themselves, so they can't be turned into garbage. I felt like here, it
makes more sense to highlight the individual operand anyway.
2024-08-13 15:05:34 +08:00
..
nu_plugin_custom_values Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu_plugin_example fix: relay Signals reset to plugins (#13510) 2024-08-06 03:35:40 -07:00
nu_plugin_formats Adding plist support (#13545) 2024-08-05 14:07:15 -07:00
nu_plugin_gstat Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu_plugin_inc Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu_plugin_nu_example Make pipeline metadata available to plugins (#13495) 2024-08-02 11:01:20 -07:00
nu_plugin_polars Merge polars sink and polars to-* to polars save (#13568) 2024-08-08 09:46:45 -07:00
nu_plugin_python Make pipeline metadata available to plugins (#13495) 2024-08-02 11:01:20 -07:00
nu_plugin_query Bump scraper from 0.19.0 to 0.20.0 (#13559) 2024-08-07 09:07:19 +08:00
nu_plugin_stress_internals Make pipeline metadata available to plugins (#13495) 2024-08-02 11:01:20 -07:00
nu-cli Replace only leading home path with ~ in the title (#13600) 2024-08-12 16:43:59 +02:00
nu-cmd-base Path migration part 3: $nu paths (#13368) 2024-08-01 10:16:31 +02:00
nu-cmd-extra Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu-cmd-lang Add type signature example for def command (#13561) 2024-08-06 21:40:30 -05:00
nu-cmd-plugin Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu-color-config Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu-command Make error-message more helpful when user invokes a non-executable file (#13589) 2024-08-12 14:21:08 +02:00
nu-derive-value Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu-engine Rework help generation internals (#13531) 2024-08-05 22:44:24 +02:00
nu-explore Clean up key event handling (#13574) 2024-08-09 18:07:50 -07:00
nu-glob Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu-json Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu-lsp Add completions.sort option (#13311) 2024-08-05 20:30:10 -04:00
nu-parser Parse time type checking for range (#13595) 2024-08-13 15:05:34 +08:00
nu-path Path migration part 3: $nu paths (#13368) 2024-08-01 10:16:31 +02:00
nu-plugin fix: relay Signals reset to plugins (#13510) 2024-08-06 03:35:40 -07:00
nu-plugin-core Make pipeline metadata available to plugins (#13495) 2024-08-02 11:01:20 -07:00
nu-plugin-engine fix: relay Signals reset to plugins (#13510) 2024-08-06 03:35:40 -07:00
nu-plugin-protocol fix: relay Signals reset to plugins (#13510) 2024-08-06 03:35:40 -07:00
nu-plugin-test-support Bump similar from 2.5.0 to 2.6.0 (#13492) 2024-07-31 08:10:33 +00:00
nu-pretty-hex Clippy fixes from stable and nightly (#13455) 2024-07-31 20:37:40 +02:00
nu-protocol Parse time type checking for range (#13595) 2024-08-13 15:05:34 +08:00
nu-std fix: Make log respect use_ansi_coloring setting. (#13442) 2024-07-30 08:34:11 -05:00
nu-system Clippy fixes from stable and nightly (#13455) 2024-07-31 20:37:40 +02:00
nu-table Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu-term-grid Bump version to 0.96.2 (#13485) 2024-07-29 17:20:55 -07:00
nu-test-support Attempt to guess the content type of a file when opening with --raw (#13521) 2024-08-06 11:36:24 +02:00
nu-utils Add completions.sort option (#13311) 2024-08-05 20:30:10 -04:00
nuon Clippy fixes from stable and nightly (#13455) 2024-07-31 20:37:40 +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.