| 1 | use std::str::FromStr; | 
| 2 |  | 
|---|
| 3 | /// Provide shell with hint on how to complete an argument. | 
|---|
| 4 | /// | 
|---|
| 5 | /// See [`Arg::value_hint`][crate::Arg::value_hint] to set this on an argument. | 
|---|
| 6 | /// | 
|---|
| 7 | /// See the `clap_complete` crate for completion script generation. | 
|---|
| 8 | /// | 
|---|
| 9 | /// Overview of which hints are supported by which shell: | 
|---|
| 10 | /// | 
|---|
| 11 | /// | Hint                   | zsh | fish[^1] | dynamic | | 
|---|
| 12 | /// | ---------------------- | --- | ---------|---------| | 
|---|
| 13 | /// | `AnyPath`              | Yes | Yes      | Yes     | | 
|---|
| 14 | /// | `FilePath`             | Yes | Yes      | Yes     | | 
|---|
| 15 | /// | `DirPath`              | Yes | Yes      | Yes     | | 
|---|
| 16 | /// | `ExecutablePath`       | Yes | Partial  | Yes     | | 
|---|
| 17 | /// | `CommandName`          | Yes | Yes      | No      | | 
|---|
| 18 | /// | `CommandString`        | Yes | Partial  | No      | | 
|---|
| 19 | /// | `CommandWithArguments` | Yes |          | No      | | 
|---|
| 20 | /// | `Username`             | Yes | Yes      | No      | | 
|---|
| 21 | /// | `Hostname`             | Yes | Yes      | No      | | 
|---|
| 22 | /// | `Url`                  | Yes |          | No      | | 
|---|
| 23 | /// | `EmailAddress`         | Yes |          | No      | | 
|---|
| 24 | /// | 
|---|
| 25 | /// [^1]: fish completions currently only support named arguments (e.g. -o or --opt), not | 
|---|
| 26 | ///       positional arguments. | 
|---|
| 27 | #[ derive(Debug, Default, PartialEq, Eq, Hash, Copy, Clone)] | 
|---|
| 28 | #[ non_exhaustive] | 
|---|
| 29 | pub enum ValueHint { | 
|---|
| 30 | /// Default value if hint is not specified. Follows shell default behavior, which is usually | 
|---|
| 31 | /// auto-completing filenames. | 
|---|
| 32 | #[default] | 
|---|
| 33 | Unknown, | 
|---|
| 34 | /// None of the hints below apply. Disables shell completion for this argument. | 
|---|
| 35 | Other, | 
|---|
| 36 | /// Any existing path. | 
|---|
| 37 | AnyPath, | 
|---|
| 38 | /// Path to a file. | 
|---|
| 39 | FilePath, | 
|---|
| 40 | /// Path to a directory. | 
|---|
| 41 | DirPath, | 
|---|
| 42 | /// Path to an executable file. | 
|---|
| 43 | ExecutablePath, | 
|---|
| 44 | /// Name of a command, without arguments. May be relative to PATH, or full path to executable. | 
|---|
| 45 | CommandName, | 
|---|
| 46 | /// A single string containing a command and its arguments. | 
|---|
| 47 | CommandString, | 
|---|
| 48 | /// Capture the remaining arguments as a command name and arguments for that command. This is | 
|---|
| 49 | /// common when writing shell wrappers that execute anther command, for example `sudo` or `env`. | 
|---|
| 50 | /// | 
|---|
| 51 | /// This hint is special, the argument must be a positional argument and have | 
|---|
| 52 | /// [`.num_args(1..)`] and Command must use [`Command::trailing_var_arg(true)`]. The result is that the | 
|---|
| 53 | /// command line `my_app ls -la /` will be parsed as `["ls", "-la", "/"]` and clap won't try to | 
|---|
| 54 | /// parse the `-la` argument itself. | 
|---|
| 55 | /// | 
|---|
| 56 | /// [`Command::trailing_var_arg(true)`]: crate::Command::trailing_var_arg | 
|---|
| 57 | /// [`.num_args(1..)`]: crate::Arg::num_args() | 
|---|
| 58 | CommandWithArguments, | 
|---|
| 59 | /// Name of a local operating system user. | 
|---|
| 60 | Username, | 
|---|
| 61 | /// Host name of a computer. | 
|---|
| 62 | /// Shells usually parse `/etc/hosts` and `.ssh/known_hosts` to complete hostnames. | 
|---|
| 63 | Hostname, | 
|---|
| 64 | /// Complete web address. | 
|---|
| 65 | Url, | 
|---|
| 66 | /// Email address. | 
|---|
| 67 | EmailAddress, | 
|---|
| 68 | } | 
|---|
| 69 |  | 
|---|
| 70 | #[ cfg(feature = "unstable-ext")] | 
|---|
| 71 | impl crate::builder::ArgExt for ValueHint {} | 
|---|
| 72 |  | 
|---|
| 73 | impl FromStr for ValueHint { | 
|---|
| 74 | type Err = String; | 
|---|
| 75 | fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> { | 
|---|
| 76 | Ok(match &*s.to_ascii_lowercase() { | 
|---|
| 77 | "unknown"=> ValueHint::Unknown, | 
|---|
| 78 | "other"=> ValueHint::Other, | 
|---|
| 79 | "anypath"=> ValueHint::AnyPath, | 
|---|
| 80 | "filepath"=> ValueHint::FilePath, | 
|---|
| 81 | "dirpath"=> ValueHint::DirPath, | 
|---|
| 82 | "executablepath"=> ValueHint::ExecutablePath, | 
|---|
| 83 | "commandname"=> ValueHint::CommandName, | 
|---|
| 84 | "commandstring"=> ValueHint::CommandString, | 
|---|
| 85 | "commandwitharguments"=> ValueHint::CommandWithArguments, | 
|---|
| 86 | "username"=> ValueHint::Username, | 
|---|
| 87 | "hostname"=> ValueHint::Hostname, | 
|---|
| 88 | "url"=> ValueHint::Url, | 
|---|
| 89 | "emailaddress"=> ValueHint::EmailAddress, | 
|---|
| 90 | _ => return Err(format!( "unknown ValueHint: `{s} `")), | 
|---|
| 91 | }) | 
|---|
| 92 | } | 
|---|
| 93 | } | 
|---|
| 94 |  | 
|---|