From 0d169494885ef9b141c73e800bff17687e2b5541 Mon Sep 17 00:00:00 2001 From: NotTheDr01ds <32344964+NotTheDr01ds@users.noreply.github.com> Date: Sun, 15 Sep 2024 08:52:35 -0400 Subject: [PATCH] Deprecate top-level std commands rather than removing immediately --- crates/nu-std/std/mod.nu | 144 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-) diff --git a/crates/nu-std/std/mod.nu b/crates/nu-std/std/mod.nu index 12487341bf..89b028dc6e 100644 --- a/crates/nu-std/std/mod.nu +++ b/crates/nu-std/std/mod.nu @@ -16,4 +16,146 @@ export module xml export-env { use dirs [] use log [] -} \ No newline at end of file +} + +def deprecation_warning [ + cmd_name: string +] { +print -e $" +(ansi red)Warning:(ansi reset) '($cmd_name)' is being moved from the 'std' library to +'std/util'. To remove this warning, import it using: + +use std/util ($cmd_name) + +" +} + +# Add the given paths to the PATH. +# +# # Example +# - adding some dummy paths to an empty PATH +# ```nushell +# >_ with-env { PATH: [] } { +# std path add "foo" +# std path add "bar" "baz" +# std path add "fooo" --append +# +# assert equal $env.PATH ["bar" "baz" "foo" "fooo"] +# +# print (std path add "returned" --ret) +# } +# ╭───┬──────────╮ +# │ 0 │ returned │ +# │ 1 │ bar │ +# │ 2 │ baz │ +# │ 3 │ foo │ +# │ 4 │ fooo │ +# ╰───┴──────────╯ +# ``` +# - adding paths based on the operating system +# ```nushell +# >_ std path add {linux: "foo", windows: "bar", darwin: "baz"} +# ``` +export def --env "path add" [ + --ret (-r) # return $env.PATH, useful in pipelines to avoid scoping. + --append (-a) # append to $env.PATH instead of prepending to. + ...paths # the paths to add to $env.PATH. +] { + deprecation_warning "path add" + + let span = (metadata $paths).span + let paths = $paths | flatten + + if ($paths | is-empty) or ($paths | length) == 0 { + error make {msg: "Empty input", label: { + text: "Provide at least one string or a record", + span: $span + }} + } + + let path_name = if "PATH" in $env { "PATH" } else { "Path" } + + let paths = $paths | each {|p| + let p = match ($p | describe | str replace --regex '<.*' '') { + "string" => $p, + "record" => { $p | get --ignore-errors $nu.os-info.name }, + } + + $p | path expand --no-symlink + } + + if null in $paths or ($paths | is-empty) { + error make {msg: "Empty input", label: { + text: $"Received a record, that does not contain a ($nu.os-info.name) key", + span: $span + }} + } + + load-env {$path_name: ( + $env + | get $path_name + | split row (char esep) + | if $append { append $paths } else { prepend $paths } + )} + + if $ret { + $env | get $path_name + } +} + +# the cute and friendly mascot of Nushell :) +export def ellie [] { + deprecation_warning ellie + let ellie = [ + " __ ,", + " .--()°'.'", + "'|, . ,'", + " !_-(_\\", + ] + + $ellie | str join "\n" | $"(ansi green)($in)(ansi reset)" +} + +# repeat anything a bunch of times, yielding a list of *n* times the input +# +# # Examples +# repeat a string +# > "foo" | std repeat 3 | str join +# "foofoofoo" +export def repeat [ + n: int # the number of repetitions, must be positive +]: any -> list { + deprecation_warning repeat + let item = $in + + if $n < 0 { + let span = metadata $n | get span + error make { + msg: $"(ansi red_bold)invalid_argument(ansi reset)" + label: { + text: $"n should be a positive integer, found ($n)" + span: $span + } + } + } + + if $n == 0 { + return [] + } + + 1..$n | each { $item } +} + +# return a null device file. +# +# # Examples +# run a command and ignore it's stderr output +# > cat xxx.txt e> (null-device) +export def null-device []: nothing -> path { + deprecation_warning "null-device" + if ($nu.os-info.name | str downcase) == "windows" { + '\\.\NUL' + } else { + "/dev/null" + } +}