nushell/crates
Firegem bb37306d07
Add lazy closure evaluation to default (#14160) (#15654)
# Description

This PR adds lazy closure evaluation to the `default` command (closes
#14160).

- For non-closure values and without providing a column name, `default`
acts the same as before
- The user can now provide multiple column names to populate if empty
- If the user provides a column name, the input must be a record or
list, otherwise an error is created.
- The user can now provide a closure as a default value
  - This closure is run without any arguments or input
  - The closure is never evaluated if the value isn't needed
- Even when column names are supplied, the closure is only run once (and
cached to prevent re-calling it)

For example:

```nushell
> default { 1 + 2 } # => 3
> null | default 3 a   # => previously `null`, now errors
> 1 | default { sleep 5sec; 3 } # => `1`, without waiting 5 seconds

> let optional_var = null; $optional_var | default { input 'Enter value: ' } # => Returns user input
> 5 | default { input 'Enter value: ' } # => `5`, without prompting user

> ls | default { sleep 5sec; 'N/A' } name # => No-op since `name` column is never empty
> ls | default { sleep 5sec; 'N/A' } foo bar # => creates columns `foo` and `bar`; only takes 5 seconds since closure result is cached

# Old behavior is the same
> [] | default 'foo' # => []
> [] | default --empty 'foo' # => 'foo'
> default 5 # => 5
```

# User-Facing Changes

- Users can add default values to multiple columns now.
- Users can now use closures as the default value passed to `default`.
- To return a closure, the user must wrap the closure they want to
return inside another closure, which will be run (`default { $my_closure
}`).

# Tests + Formatting

All tests pass.

# After Submitting

---------

Co-authored-by: 132ikl <132@ikl.sh>
2025-05-15 10:10:56 -04:00
..
nu_plugin_custom_values Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu_plugin_example Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu_plugin_formats Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu_plugin_gstat Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu_plugin_inc Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu_plugin_javascript create nu_plugin_node_example.js (#15482) 2025-04-11 21:18:46 +02:00
nu_plugin_nu_example feat: make to nuon raw option remove all white space (#15609) 2025-05-09 09:38:24 +08:00
nu_plugin_polars Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu_plugin_python Bump to 0.104.1 dev version (#15669) 2025-04-29 23:33:10 -04:00
nu_plugin_query Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu_plugin_stress_internals Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-cli Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-cmd-base Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-cmd-extra Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-cmd-lang Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-cmd-plugin Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-color-config Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-command Add lazy closure evaluation to default (#14160) (#15654) 2025-05-15 10:10:56 -04:00
nu-derive-value Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-engine Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-explore Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-glob Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-json Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-lsp Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-parser fix parsing of bare word string interpolations that start with a sub expression (#15735) 2025-05-13 22:25:07 +03:00
nu-path Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-plugin Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-plugin-core Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-plugin-engine Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-plugin-protocol Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-plugin-test-support Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-pretty-hex Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-protocol Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-std Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-system Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-table fix: empty tables now respect $env.config.use_ansi_coloring (closes #14896) (#15751) 2025-05-14 06:40:15 -05:00
nu-term-grid Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-test-support Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nu-utils Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +02:00
nuon Rust 1.85, edition=2024 (#15741) 2025-05-13 16:49:30 +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.