nushell/crates/nu-command/src/path
Bahex 8771872d86
Add path self command for getting absolute paths to files at parse time (#14303)
Alternative solution to:
- #12195 

The other approach:
- #14305

# Description
Adds ~`path const`~ `path self`, a parse-time only command for getting
the absolute path of the source file containing it, or any file relative
to the source file.

- Useful for any script or module that makes use of non nuscript files.
- Removes the need for `$env.CURRENT_FILE` and `$env.FILE_PWD`.
- Can be used in modules, sourced files or scripts.

# Examples

```nushell
# ~/.config/nushell/scripts/foo.nu
const paths = {
    self: (path self),
    dir: (path self .),
    sibling: (path self sibling),
    parent_dir: (path self ..),
    cousin: (path self ../cousin),
}

export def main [] {
    $paths
}
```

```nushell
> use foo.nu
> foo
╭────────────┬────────────────────────────────────────────╮
│ self       │ /home/user/.config/nushell/scripts/foo.nu  │
│ dir        │ /home/user/.config/nushell/scripts         │
│ sibling    │ /home/user/.config/nushell/scripts/sibling │
│ parent_dir │ /home/user/.config/nushell                 │
│ cousin     │ /home/user/.config/nushell/cousin          │
╰────────────┴────────────────────────────────────────────╯
```


Trying to run in a non-const context
```nushell
> path self
Error:   × this command can only run during parse-time
   ╭─[entry #1:1:1]
 1 │ path self 
   · ─────┬────
   ·      ╰── can't run after parse-time
   ╰────
  help: try assigning this command's output to a const variable
```

Trying to run in the REPL i.e. not in a file
```nushell
> const foo = path self
Error:   × Error: nu:🐚:file_not_found
  │ 
  │   × File not found
  │    ╭─[entry #3:1:13]
  │  1 │ const foo = path self
  │    ·             ─────┬────
  │    ·                  ╰── Couldn't find current file
  │    ╰────
  │ 
   ╭─[entry #3:1:13]
 1 │ const foo = path self
   ·             ─────┬────
   ·                  ╰── Encountered error during parse-time evaluation
   ╰────
```

# Comparison with #14305
## Pros
- Self contained implementation, does not require changes in the parser.
- More concise usage, especially with parent directories.

---------

Co-authored-by: Darren Schroeder <343840+fdncred@users.noreply.github.com>
2024-12-06 08:19:08 -06:00
..
basename.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
dirname.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
exists.rs fix path exists on a non-directory file (#13763) 2024-09-11 12:45:39 -05:00
expand.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
join.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
mod.rs Add path self command for getting absolute paths to files at parse time (#14303) 2024-12-06 08:19:08 -06:00
parse.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
path_.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
relative_to.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
self_.rs Add path self command for getting absolute paths to files at parse time (#14303) 2024-12-06 08:19:08 -06:00
split.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00
type.rs Change the usage misnomer to "description" (#13598) 2024-08-22 12:02:08 +02:00