mirror of
https://github.com/nushell/nushell.git
synced 2024-11-25 09:53:43 +01:00
b79a2255d2
# Description After discussing with @sholderbach the cumbersome usage of `nu_protocol::Value` in Rust, I created a derive macro to simplify it. I’ve added a new crate called `nu-derive-value`, which includes two macros, `IntoValue` and `FromValue`. These are re-exported in `nu-protocol` and should be encouraged to be used via that re-export. The macros ensure that all types can easily convert from and into `Value`. For example, as a plugin author, you can define your plugin configuration using a Rust struct and easily convert it using `FromValue`. This makes plugin configuration less of a hassle. I introduced the `IntoValue` trait for a standardized approach to converting values into `Value` (and a fallible variant `TryIntoValue`). This trait could potentially replace existing `into_value` methods. Along with this, I've implemented `FromValue` for several standard types and refined other implementations to use blanket implementations where applicable. I made these design choices with input from @devyn. There are more improvements possible, but this is a solid start and the PR is already quite substantial. # User-Facing Changes For `nu-protocol` users, these changes simplify the handling of `Value`s. There are no changes for end-users of nushell itself. # Tests + Formatting Documenting the macros itself is not really possible, as they cannot really reference any other types since they are the root of the dependency graph. The standard library has the same problem ([std::Debug](https://doc.rust-lang.org/stable/std/fmt/derive.Debug.html)). However I documented the `FromValue` and `IntoValue` traits completely. For testing, I made of use `proc-macro2` in the derive macro code. This would allow testing the generated source code. Instead I just tested that the derived functionality is correct. This is done in `nu_protocol::value::test_derive`, as a consumer of `nu-derive-value` needs to do the testing of the macro usage. I think that these tests should provide a stable baseline so that users can be sure that the impl works. # After Submitting With these macros available, we can probably use them in some examples for plugins to showcase the use of them.
314 lines
8.8 KiB
TOML
314 lines
8.8 KiB
TOML
[package]
|
|
authors = ["The Nushell Project Developers"]
|
|
build = "scripts/build.rs"
|
|
default-run = "nu"
|
|
description = "A new type of shell"
|
|
documentation = "https://www.nushell.sh/book/"
|
|
edition = "2021"
|
|
exclude = ["images"]
|
|
homepage = "https://www.nushell.sh"
|
|
license = "MIT"
|
|
name = "nu"
|
|
repository = "https://github.com/nushell/nushell"
|
|
rust-version = "1.77.2"
|
|
version = "0.94.3"
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[package.metadata.binstall]
|
|
pkg-url = "{ repo }/releases/download/{ version }/{ name }-{ version }-{ target }.{ archive-format }"
|
|
pkg-fmt = "tgz"
|
|
|
|
[package.metadata.binstall.overrides.x86_64-pc-windows-msvc]
|
|
pkg-fmt = "zip"
|
|
|
|
[workspace]
|
|
members = [
|
|
"crates/nu-cli",
|
|
"crates/nu-engine",
|
|
"crates/nu-parser",
|
|
"crates/nu-system",
|
|
"crates/nu-cmd-base",
|
|
"crates/nu-cmd-extra",
|
|
"crates/nu-cmd-lang",
|
|
"crates/nu-cmd-plugin",
|
|
"crates/nu-command",
|
|
"crates/nu-color-config",
|
|
"crates/nu-explore",
|
|
"crates/nu-json",
|
|
"crates/nu-lsp",
|
|
"crates/nu-pretty-hex",
|
|
"crates/nu-protocol",
|
|
"crates/nu-derive-value",
|
|
"crates/nu-plugin",
|
|
"crates/nu-plugin-core",
|
|
"crates/nu-plugin-engine",
|
|
"crates/nu-plugin-protocol",
|
|
"crates/nu-plugin-test-support",
|
|
"crates/nu_plugin_inc",
|
|
"crates/nu_plugin_gstat",
|
|
"crates/nu_plugin_example",
|
|
"crates/nu_plugin_query",
|
|
"crates/nu_plugin_custom_values",
|
|
"crates/nu_plugin_formats",
|
|
"crates/nu_plugin_polars",
|
|
"crates/nu_plugin_stress_internals",
|
|
"crates/nu-std",
|
|
"crates/nu-table",
|
|
"crates/nu-term-grid",
|
|
"crates/nu-test-support",
|
|
"crates/nu-utils",
|
|
"crates/nuon",
|
|
]
|
|
|
|
[workspace.dependencies]
|
|
alphanumeric-sort = "1.5"
|
|
ansi-str = "0.8"
|
|
anyhow = "1.0.82"
|
|
base64 = "0.22.1"
|
|
bracoxide = "0.1.2"
|
|
brotli = "5.0"
|
|
byteorder = "1.5"
|
|
bytesize = "1.3"
|
|
calamine = "0.24.0"
|
|
chardetng = "0.1.17"
|
|
chrono = { default-features = false, version = "0.4.34" }
|
|
chrono-humanize = "0.2.3"
|
|
chrono-tz = "0.8"
|
|
convert_case = "0.6"
|
|
crossbeam-channel = "0.5.8"
|
|
crossterm = "0.27"
|
|
csv = "1.3"
|
|
ctrlc = "3.4"
|
|
dialoguer = { default-features = false, version = "0.11" }
|
|
digest = { default-features = false, version = "0.10" }
|
|
dirs-next = "2.0"
|
|
dtparse = "2.0"
|
|
encoding_rs = "0.8"
|
|
fancy-regex = "0.13"
|
|
filesize = "0.2"
|
|
filetime = "0.2"
|
|
fs_extra = "1.3"
|
|
fuzzy-matcher = "0.3"
|
|
hamcrest2 = "0.3"
|
|
heck = "0.5.0"
|
|
human-date-parser = "0.1.1"
|
|
indexmap = "2.2"
|
|
indicatif = "0.17"
|
|
interprocess = "2.1.0"
|
|
is_executable = "1.0"
|
|
itertools = "0.12"
|
|
libc = "0.2"
|
|
libproc = "0.14"
|
|
log = "0.4"
|
|
lru = "0.12"
|
|
lscolors = { version = "0.17", default-features = false }
|
|
lsp-server = "0.7.5"
|
|
lsp-types = "0.95.0"
|
|
mach2 = "0.4"
|
|
md5 = { version = "0.10", package = "md-5" }
|
|
miette = "7.2"
|
|
mime = "0.3"
|
|
mime_guess = "2.0"
|
|
mockito = { version = "1.4", default-features = false }
|
|
native-tls = "0.2"
|
|
nix = { version = "0.28", default-features = false }
|
|
notify-debouncer-full = { version = "0.3", default-features = false }
|
|
nu-ansi-term = "0.50.0"
|
|
num-format = "0.4"
|
|
num-traits = "0.2"
|
|
omnipath = "0.1"
|
|
once_cell = "1.18"
|
|
open = "5.1"
|
|
os_pipe = { version = "1.2", features = ["io_safety"] }
|
|
pathdiff = "0.2"
|
|
percent-encoding = "2"
|
|
pretty_assertions = "1.4"
|
|
print-positions = "0.6"
|
|
proc-macro-error = { version = "1.0", default-features = false }
|
|
proc-macro2 = "1.0"
|
|
procfs = "0.16.0"
|
|
pwd = "1.3"
|
|
quick-xml = "0.31.0"
|
|
quickcheck = "1.0"
|
|
quickcheck_macros = "1.0"
|
|
quote = "1.0"
|
|
rand = "0.8"
|
|
ratatui = "0.26"
|
|
rayon = "1.10"
|
|
reedline = "0.32.0"
|
|
regex = "1.9.5"
|
|
rmp = "0.8"
|
|
rmp-serde = "1.3"
|
|
ropey = "1.6.1"
|
|
roxmltree = "0.19"
|
|
rstest = { version = "0.18", default-features = false }
|
|
rusqlite = "0.31"
|
|
rust-embed = "8.4.0"
|
|
same-file = "1.0"
|
|
serde = { version = "1.0", default-features = false }
|
|
serde_json = "1.0"
|
|
serde_urlencoded = "0.7.1"
|
|
serde_yaml = "0.9"
|
|
sha2 = "0.10"
|
|
strip-ansi-escapes = "0.2.0"
|
|
syn = "2.0"
|
|
sysinfo = "0.30"
|
|
tabled = { version = "0.14.0", default-features = false }
|
|
tempfile = "3.10"
|
|
terminal_size = "0.3"
|
|
titlecase = "2.0"
|
|
toml = "0.8"
|
|
trash = "3.3"
|
|
umask = "2.1"
|
|
unicode-segmentation = "1.11"
|
|
unicode-width = "0.1"
|
|
ureq = { version = "2.9", default-features = false }
|
|
url = "2.2"
|
|
uu_cp = "0.0.26"
|
|
uu_mkdir = "0.0.26"
|
|
uu_mktemp = "0.0.26"
|
|
uu_mv = "0.0.26"
|
|
uu_whoami = "0.0.26"
|
|
uu_uname = "0.0.26"
|
|
uucore = "0.0.26"
|
|
uuid = "1.8.0"
|
|
v_htmlescape = "0.15.0"
|
|
wax = "0.6"
|
|
which = "6.0.0"
|
|
windows = "0.54"
|
|
winreg = "0.52"
|
|
|
|
[dependencies]
|
|
nu-cli = { path = "./crates/nu-cli", version = "0.94.3" }
|
|
nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.94.3" }
|
|
nu-cmd-lang = { path = "./crates/nu-cmd-lang", version = "0.94.3" }
|
|
nu-cmd-plugin = { path = "./crates/nu-cmd-plugin", version = "0.94.3", optional = true }
|
|
nu-cmd-extra = { path = "./crates/nu-cmd-extra", version = "0.94.3" }
|
|
nu-command = { path = "./crates/nu-command", version = "0.94.3" }
|
|
nu-engine = { path = "./crates/nu-engine", version = "0.94.3" }
|
|
nu-explore = { path = "./crates/nu-explore", version = "0.94.3" }
|
|
nu-lsp = { path = "./crates/nu-lsp/", version = "0.94.3" }
|
|
nu-parser = { path = "./crates/nu-parser", version = "0.94.3" }
|
|
nu-path = { path = "./crates/nu-path", version = "0.94.3" }
|
|
nu-plugin-engine = { path = "./crates/nu-plugin-engine", optional = true, version = "0.94.3" }
|
|
nu-protocol = { path = "./crates/nu-protocol", version = "0.94.3" }
|
|
nu-std = { path = "./crates/nu-std", version = "0.94.3" }
|
|
nu-system = { path = "./crates/nu-system", version = "0.94.3" }
|
|
nu-utils = { path = "./crates/nu-utils", version = "0.94.3" }
|
|
|
|
reedline = { workspace = true, features = ["bashisms", "sqlite"] }
|
|
|
|
crossterm = { workspace = true }
|
|
ctrlc = { workspace = true }
|
|
dirs-next = { workspace = true }
|
|
log = { workspace = true }
|
|
miette = { workspace = true, features = ["fancy-no-backtrace", "fancy"] }
|
|
mimalloc = { version = "0.1.42", default-features = false, optional = true }
|
|
serde_json = { workspace = true }
|
|
simplelog = "0.12"
|
|
time = "0.3"
|
|
|
|
[target.'cfg(not(target_os = "windows"))'.dependencies]
|
|
# Our dependencies don't use OpenSSL on Windows
|
|
openssl = { version = "0.10", features = ["vendored"], optional = true }
|
|
|
|
[target.'cfg(windows)'.build-dependencies]
|
|
winresource = "0.1"
|
|
|
|
[target.'cfg(target_family = "unix")'.dependencies]
|
|
nix = { workspace = true, default-features = false, features = [
|
|
"signal",
|
|
"process",
|
|
"fs",
|
|
"term",
|
|
] }
|
|
|
|
[dev-dependencies]
|
|
nu-test-support = { path = "./crates/nu-test-support", version = "0.94.3" }
|
|
nu-plugin-protocol = { path = "./crates/nu-plugin-protocol", version = "0.94.3" }
|
|
nu-plugin-core = { path = "./crates/nu-plugin-core", version = "0.94.3" }
|
|
assert_cmd = "2.0"
|
|
dirs-next = { workspace = true }
|
|
tango-bench = "0.5"
|
|
pretty_assertions = { workspace = true }
|
|
rstest = { workspace = true, default-features = false }
|
|
serial_test = "3.1"
|
|
tempfile = { workspace = true }
|
|
|
|
[features]
|
|
plugin = [
|
|
"nu-plugin-engine",
|
|
"nu-cmd-plugin",
|
|
"nu-cli/plugin",
|
|
"nu-parser/plugin",
|
|
"nu-command/plugin",
|
|
"nu-protocol/plugin",
|
|
"nu-engine/plugin",
|
|
]
|
|
default = ["default-no-clipboard", "system-clipboard"]
|
|
# Enables convenient omitting of the system-clipboard feature, as it leads to problems in ci on linux
|
|
# See https://github.com/nushell/nushell/pull/11535
|
|
default-no-clipboard = [
|
|
"plugin",
|
|
"trash-support",
|
|
"sqlite",
|
|
"mimalloc",
|
|
]
|
|
stable = ["default"]
|
|
# NOTE: individual features are also passed to `nu-cmd-lang` that uses them to generate the feature matrix in the `version` command
|
|
|
|
# Enable to statically link OpenSSL (perl is required, to build OpenSSL https://docs.rs/openssl/latest/openssl/);
|
|
# otherwise the system version will be used. Not enabled by default because it takes a while to build
|
|
static-link-openssl = ["dep:openssl", "nu-cmd-lang/static-link-openssl"]
|
|
|
|
mimalloc = ["nu-cmd-lang/mimalloc", "dep:mimalloc"]
|
|
system-clipboard = [
|
|
"reedline/system_clipboard",
|
|
"nu-cli/system-clipboard",
|
|
"nu-cmd-lang/system-clipboard",
|
|
]
|
|
|
|
# Stable (Default)
|
|
trash-support = ["nu-command/trash-support", "nu-cmd-lang/trash-support"]
|
|
|
|
# SQLite commands for nushell
|
|
sqlite = ["nu-command/sqlite", "nu-cmd-lang/sqlite"]
|
|
|
|
[profile.release]
|
|
opt-level = "s" # Optimize for size
|
|
strip = "debuginfo"
|
|
lto = "thin"
|
|
|
|
# build with `cargo build --profile profiling`
|
|
# to analyze performance with tooling like linux perf
|
|
[profile.profiling]
|
|
inherits = "release"
|
|
strip = false
|
|
debug = true
|
|
|
|
# build with `cargo build --profile ci`
|
|
# to analyze performance with tooling like linux perf
|
|
[profile.ci]
|
|
inherits = "dev"
|
|
strip = false
|
|
debug = false
|
|
|
|
# Main nu binary
|
|
[[bin]]
|
|
name = "nu"
|
|
path = "src/main.rs"
|
|
bench = false
|
|
|
|
# To use a development version of a dependency please use a global override here
|
|
# changing versions in each sub-crate of the workspace is tedious
|
|
[patch.crates-io]
|
|
# reedline = { git = "https://github.com/nushell/reedline", branch = "main" }
|
|
# nu-ansi-term = {git = "https://github.com/nushell/nu-ansi-term.git", branch = "main"}
|
|
|
|
# Run all benchmarks with `cargo bench`
|
|
# Run individual benchmarks like `cargo bench -- <regex>` e.g. `cargo bench -- parse`
|
|
[[bench]]
|
|
name = "benchmarks"
|
|
harness = false
|