nushell/crates
Bob Hyman 007916c2c1
Syntax errors for string and int (#7952)
# Description

Added a few syntax errors in ints and strings, changed parser to stop
and show that error rather than continue trying to parse those tokens as
some other shape. However, I don't see how to push this direction much
further, and most of the classic confusing errors can't be changed.

Flagged as WIP for the moment, but passes all checks and works better
than current release:
1. I have yet to figure out how to make these errors refer back to the
book, as I see some other errors do.
2. How to give syntax error when malformed int is first token in line?
Currently parsed as external command, user gets confusing error message.
3. Would like to be more strict with *decimal* int literals (lacking,
e.g, `0x' prefix). Need to tinker more with the order of parse shape
calls, currently, float is tried after int, so '1.4' has to be passed.

_(Description of your pull request goes here. **Provide examples and/or
screenshots** if your changes affect the user experience.)_

```bash

〉"\z"
Error: 
   ╭─[entry #3:1:1]
 1 │ "\z"
   ·  ─┬─
   ·   ╰── Syntax error in string, unrecognized character after escape '\'.
   ╰────
```
Canonic presentation of a syntax error.
```bash
〉"  \u{01ffbogus}"
Error: 
  × Invalid syntax
   ╭─[entry #2:1:1]
 1 │ "  \u{01ffbogus}"
   ·    ───────┬──────
   ·           ╰── Syntax error in string, expecting 1 to 6 hex digits in unicode escape '\u{X...}', max value 10FFFF.
   ╰────
```
Malformed unicode escape in string, flagged as error.  
String parse can be opinionated, it's the last shape tried.
```bash
〉0x22bogus
Error: nu:🐚:external_command (link)
  × External command failed
   ╭─[entry #4:1:1]
1 │ 0x22bogus
   · ────┬────
   ·     ╰── executable was not found
   ╰────
  help: No such file or directory (os error 2)
```
A *correct* number in first token would be evaluated, but an *incorrect*
one is treated as external command? Confusing to users.
```bash
〉0 + 0x22bogus
Error: 
  × Invalid syntax
   ╭─[entry #5:1:1]
1 │ 0 + 0x22bogus
   ·     ────┬────
   ·         ╰── Syntax error in int, invalid digits in radix 16 int.
   ╰────
```
Can give syntax error if token is unambiguously int literal. e.g has 0b
or 0x prefix, could not be a float.
```bash
〉0 + 098bogus
Error: nu::parser::unsupported_operation (link)

  × Types mismatched for operation.
   ╭─[entry #6:1:1]
 1 │ 0 + 098bogus
   · ┬ ┬ ────┬───
   · │ │     ╰── string
   · │ ╰── doesn't support these values.
   · ╰── int
   ╰────
  help: Change int or string to be the right types and try again.
```
But *decimal* literal (no prefix) can't be too strict. Parser is going
to try float later. So '1.4' must be passed.

# User-Facing Changes

First and foremost, more specific error messages for typos in string and
int literals. Probably improves interactive user experience.

But a script that was causing and then checking for specific error might
notice a different error message.

_(List of all changes that impact the user experience here. This helps
us keep track of breaking changes.)_

# Tests + Formatting

Added (positive and negative unit tests in `cargo test -p nu-parser`.
Didn't add integration tests.

Make sure you've run and fixed any issues with these commands:

- [x] `cargo fmt --all -- --check` to check standard code formatting
(`cargo fmt --all` applies these changes)
- [x] `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A
clippy::needless_collect` to check that you're using the standard code
style
- [x] `cargo test --workspace` to check that all tests pass

# After Submitting

If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.

---------

Co-authored-by: Stefan Holderbach <sholderbach@users.noreply.github.com>
2023-02-13 16:09:50 +00:00
..
nu_plugin_custom_values Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu_plugin_example Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu_plugin_formats Move some from xxx commands to plugin (#7942) 2023-02-13 12:42:08 +00:00
nu_plugin_gstat Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu_plugin_inc Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu_plugin_python Fix typos by codespell (#7600) 2022-12-26 02:31:26 -05:00
nu_plugin_query Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-cli Bump rstest from 0.15.0 to 0.16.0 (#8064) 2023-02-13 02:34:09 +00:00
nu-color-config Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-command Move some from xxx commands to plugin (#7942) 2023-02-13 12:42:08 +00:00
nu-engine Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-explore Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-glob Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-json Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-parser Syntax errors for string and int (#7952) 2023-02-13 16:09:50 +00:00
nu-path Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-plugin Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-pretty-hex Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-protocol Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-system Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-table Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-term-grid Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00:00
nu-test-support Move some from xxx commands to plugin (#7942) 2023-02-13 12:42:08 +00:00
nu-utils Disable auto-benchmark harness for crates (#8057) 2023-02-12 22:22:00 +00: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.