nushell/crates/nu-protocol/src
Stefan Holderbach c87bac04c0
Add common map-like API to nu_protocol::Record (#10841)
# Description

> Our `Record` looks like a map, quacks like a map, so let's treat it
with the API for a map

Implement common methods found on e.g. `std::collections::HashMap` or
the insertion-ordered [indexmap](https://docs.rs/indexmap).

This allows contributors to not have to worry about how to get to the
relevant items and not mess up the assumptions of a Nushell record.

## Record assumptions
- `cols` and `vals` are of equal length
- for all practical purposes, keys/columns should be unique

## End goal

The end goal of the upcoming series of PR's is to allow us to make
`cols` and `vals` private.
Then it would be possible to exchange the backing datastructure to best
fit the expected workload.
This could be statically (by finding the best balance) or dynamically by
using an `enum` of potential representations.

## Parts
- Add validating explicit part constructor
`Record::from_raw_cols_vals()`
- Add `Record.columns()` iterator
- Add `Record.values()` iterator
- Add consuming `Record.into_values()` iterator
- Add `Record.contains()` helper
- Add `Record.insert()` that respects existing keys
- Add key-based `.get()`/`.get_mut()` to `Record`
- Add `Record.get_index()` for index-based access
- Implement `Extend` for `Record` naively
- Use checked constructor in `record!` macro
- Add `Record.index_of()` to get index by key

# User-Facing Changes
None directly

# Developer facing changes
You don't have to roll your own record handling and can use a familiar
API

# Tests + Formatting
No explicit unit tests yet. Wouldn't be too tricky to validate core
properties directly.
Will be exercised by the following PRs using the new
methods/traits/iterators.
2023-10-28 15:18:41 +02:00
..
ast Allow operator in constants (#10212) 2023-09-05 16:35:58 +02:00
engine Support pattern matching null literals (#10829) 2023-10-25 06:30:45 +08:00
value Add common map-like API to nu_protocol::Record (#10841) 2023-10-28 15:18:41 +02:00
alias.rs Refactor scope commands (#10023) 2023-08-17 11:58:38 +03:00
cli_error.rs Screen reader-friendly errors (#10122) 2023-08-27 06:54:15 -05:00
config.rs Remove cd w/ abbreviations (#10588) 2023-10-03 10:51:46 +13:00
did_you_mean.rs Suggest existing variables on not found (#8902) 2023-05-02 18:17:14 +03:00
eval_const.rs Remove python-like string multiplication (#10293) 2023-09-13 19:52:04 +12:00
example.rs remove unused imports: Deserialize, Serialize compiler warning for nu-protocol/src/example.rs (#8514) 2023-03-18 11:45:12 -07:00
exportable.rs Module: support defining const and use const variables inside of function (#9773) 2023-08-01 07:09:52 +08:00
id.rs Add virtual path abstraction layer (#9245) 2023-05-23 23:48:50 +03:00
lev_distance.rs Suggest existing variables on not found (#8902) 2023-05-02 18:17:14 +03:00
lib.rs remove the $nothing variable (#10567) 2023-10-19 18:41:38 +02:00
module.rs Create Record type (#10103) 2023-08-25 07:50:29 +12:00
parse_error.rs Add --env and --wrapped flags to def (#10566) 2023-10-02 21:13:31 +03:00
pipeline_data.rs Finish removing profile command and related data (#10807) 2023-10-22 14:06:53 +03:00
plugin_signature.rs Rename main to script name when running scripts (#9948) 2023-08-12 05:58:49 +12:00
shell_error.rs Allow filesystem commands to access files with glob metachars in name (#10694) 2023-10-18 13:31:15 -05:00
signature.rs Rename misused "deprecation" to removal (#10000) 2023-08-15 07:17:31 +12:00
span.rs Use variable names directly in the format strings (#7906) 2023-01-29 19:37:54 -06:00
syntax_shape.rs Rename SyntaxShape::Custom to CompleterWrapper (#10548) 2023-09-29 19:22:58 +02:00
ty.rs change Type::Float => SyntaxShape::Number to SyntaxShape::Float (#10689) 2023-10-11 12:27:09 -05:00
util.rs move BufferedReader out of nu-command (#7697) 2023-01-06 15:22:17 -08:00
variable.rs Fix broken constants in scopes (#9679) 2023-07-14 00:02:05 +03:00