nushell/crates/nu-command/src
mike 77ca73f414
allow records to have type annotations (#8914)
# Description
follow up to #8529
cleaned up version of #8892 

- the original syntax is okay
```nu
def okay [rec: record] {}
```
- you can now add type annotations for fields if you know
  them before hand
```nu
def okay [rec: record<name: string>] {}
```

- you can specify multiple fields
```nu
def okay [person: record<name: string age: int>] {}

# an optional comma is allowed
def okay [person: record<name: string, age: int>] {}
```

- if annotations are specified, any use of the command will be type
  checked against the specified type
```nu
def unwrap [result: record<ok: bool, value: any>] {}

unwrap {ok: 2, value: "value"}

# errors with

Error: nu::parser::type_mismatch

  × Type mismatch.
   ╭─[entry #4:1:1]
 1 │ unwrap {ok: 2, value: "value"}
   ·         ───────┬─────
   ·                    ╰── expected record<ok: bool, value: any>, found record<ok: int, value: string>
   ╰────
```
> here the error is in the `ok` field, since `any` is coerced into any
type
> as a result `unwrap {ok: true, value: "value"}` is okay

- the key must be a string, either quoted or unquoted
```nu
def err [rec: record<{}: list>] {}

# errors with
Error:
  × `record` type annotations key not string
   ╭─[entry #7:1:1]
 1 │ def unwrap [result: record<{}: bool, value: any>] {}
   ·                            ─┬
   ·                             ╰── must be a string
   ╰────
```

- a key doesn't have to have a type in which case it is assumed to be
`any`
```nu
def okay [person: record<name age>] {}

def okay [person: record<name: string age>] {}
```

- however, if you put a colon, you have to specify a type
```nu
def err [person: record<name: >] {}

# errors with
Error: nu::parser::parse_mismatch

  × Parse mismatch during operation.
   ╭─[entry #12:1:1]
 1 │ def unwrap [res: record<name: >] { $res }
   ·                             ┬
   ·                             ╰── expected type after colon
   ╰────
```

# User-Facing Changes
**[BREAKING CHANGES]**
- this change adds a field to `SyntaxShape::Record` so any plugins that
used it will have to update and include the field. though if you are
unsure of the type the record expects, `SyntaxShape::Record(vec![])`
will suffice
2023-04-26 08:16:55 -05:00
..
bits Require that values that look like numbers parse as numberlike (#8635) 2023-03-28 19:31:38 +13:00
bytes make bytes at use ranges (#8710) 2023-04-03 04:28:36 +12:00
charting fix: fixed typo and improved Value TypeMismatch exceptions (#8324) 2023-03-22 09:47:40 +01:00
conversions Fix into decimal command category (#8932) 2023-04-19 11:39:12 -05:00
database Add pattern matching (#8590) 2023-03-24 14:52:01 +13:00
dataframe Remove old alias implementation (#8797) 2023-04-07 21:09:38 +03:00
date Update some help examples (#8759) 2023-04-05 18:36:00 -05:00
debug update ast to support output to json (#8962) 2023-04-26 08:15:42 -05:00
deprecated Allow NU_LIBS_DIR and friends to be const (#8538) 2023-04-05 19:56:48 +03:00
env allow records to have type annotations (#8914) 2023-04-26 08:16:55 -05:00
experimental Uniformize usage() and extra_usage() message ending for commands helper. (#8268) 2023-02-28 21:33:02 -08:00
filesystem rm: enable trash flag on android and ios platrofm (#8871) 2023-04-13 07:34:52 -05:00
filters allow find command to look in specified columns only (#8937) 2023-04-20 08:13:12 -05:00
formats Remove old alias implementation (#8797) 2023-04-07 21:09:38 +03:00
generators Document and critically review ShellError variants - Ep. 2 (#8326) 2023-03-06 11:31:07 +01:00
hash optimize hash md5 for binary input (#8860) 2023-04-13 19:29:06 +02:00
math Add math exp command (issue #8661) (#8700) 2023-04-01 12:53:58 +02:00
misc Move CLI related commands to nu-cli (#8832) 2023-04-10 10:56:47 +12:00
network Fix record-to-JSON conversion for HTTP commands (#8663) 2023-03-29 11:55:51 -07:00
path Box ShellError in Value::Error (#8375) 2023-03-12 09:57:27 +01:00
platform Move CLI related commands to nu-cli (#8832) 2023-04-10 10:56:47 +12:00
random Document and critically review ShellError variants - Ep. 3 (#8340) 2023-03-06 18:33:09 +01:00
shells Require that values that look like numbers parse as numberlike (#8635) 2023-03-28 19:31:38 +13:00
strings Revert numberlike parsing restriction (#8845) 2023-04-12 05:21:31 +12:00
system Tweak run-external signature so command must be a string (#8971) 2023-04-22 10:57:16 -07:00
viewers Update crossterm version to 0.26 (#8623) 2023-04-14 22:14:57 +02:00
default_context.rs feat: added items command for Records (#8640) 2023-04-14 14:42:33 -05:00
example_test.rs cratification: Example support (#8231) 2023-02-27 13:58:56 -08:00
hook.rs remove nu_cli crate dependency from nu_std (#8807) 2023-04-08 13:53:43 +02:00
input_handler.rs Box ShellError in Value::Error (#8375) 2023-03-12 09:57:27 +01:00
lib.rs feat: add a command_not_found hook (#8314) 2023-03-20 17:05:22 +13:00
progress_bar.rs cp progress bar implementation (#8012) 2023-02-22 11:57:38 -08:00
sort_utils.rs Support passing an empty list to sort, uniq, sort-by, and uniq-by (issue #5957) (#8669) 2023-03-29 19:55:38 -07:00
util.rs Fix process_range on 32-bit platforms (#8842) 2023-04-11 06:52:42 +12:00