nushell/crates/nu-cmd-lang
Ian Manske 8da27a1a09
Create Record type (#10103)
# Description
This PR creates a new `Record` type to reduce duplicate code and
possibly bugs as well. (This is an edited version of #9648.)
- `Record` implements `FromIterator` and `IntoIterator` and so can be
iterated over or collected into. For example, this helps with
conversions to and from (hash)maps. (Also, no more
`cols.iter().zip(vals)`!)
- `Record` has a `push(col, val)` function to help insure that the
number of columns is equal to the number of values. I caught a few
potential bugs thanks to this (e.g. in the `ls` command).
- Finally, this PR also adds a `record!` macro that helps simplify
record creation. It is used like so:
   ```rust
   record! {
       "key1" => some_value,
       "key2" => Value::string("text", span),
       "key3" => Value::int(optional_int.unwrap_or(0), span),
       "key4" => Value::bool(config.setting, span),
   }
   ```
Since macros hinder formatting, etc., the right hand side values should
be relatively short and sweet like the examples above.

Where possible, prefer `record!` or `.collect()` on an iterator instead
of multiple `Record::push`s, since the first two automatically set the
record capacity and do less work overall.

# User-Facing Changes
Besides the changes in `nu-protocol` the only other breaking changes are
to `nu-table::{ExpandedTable::build_map, JustTable::kv_table}`.
2023-08-25 07:50:29 +12:00
..
src Create Record type (#10103) 2023-08-25 07:50:29 +12:00
build.rs Cratification: Break out nu_cmd_lang into a separate crate (#8181) 2023-02-24 09:54:42 -06:00
Cargo.toml bump nushell to dev version 0.84.1 (#10101) 2023-08-23 15:23:27 -05:00
LICENSE Fix rest of license year ranges (#8727) 2023-04-04 09:03:29 +12:00
README.md nu-cmd-lang readme (#9446) 2023-06-15 08:45:23 -07:00

nu-cmd-lang

the base language and command crate of nu

The commands in this crate are the core commands of the nu language. It is also the base crate upon which all other command crates sit on top of including:

  • nu-command
  • nu-cli
  • nu-cmd-dataframe
  • nu-cmd-extra

As time goes on and the nu language develops further in parallel with nushell we will be adding other command crates to the system.

What does it mean to be a base crate ?

A base crate is one with minimal dependencies in our system so that other developers can come along and use this crate without having a lot of baggage in terms of other crates which will bloat their underlying application.

Background on nu-cmd-lang

This crate was designed to be a small, concise set of tools or commands that serve as the foundation layer of both nu and nushell. These are the core commands needed to have a nice working version of the nu language without all of the support that the other commands provide inside nushell. Prior to the launch of this crate all of our commands were housed in the crate nu-command. Moving forward we would like to slowly break out the commands in nu-command into different crates; the naming and how this will work and where all the commands will be located is a "work in progress" especially now that the standard library is starting to become more popular as a location for commands. As time goes on some of our commands written in rust will be migrated to nu and when this happens they will be moved into the standard library.