summaryrefslogtreecommitdiff
path: root/examples/completion-derive.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/completion-derive.rs')
-rw-r--r--examples/completion-derive.rs83
1 files changed, 83 insertions, 0 deletions
diff --git a/examples/completion-derive.rs b/examples/completion-derive.rs
new file mode 100644
index 0000000..9f1a55d
--- /dev/null
+++ b/examples/completion-derive.rs
@@ -0,0 +1,83 @@
+//! How to use value hints and generate shell completions.
+//!
+//! Usage with zsh:
+//! ```console
+//! $ cargo run --example completion-derive -- --generate=zsh > /usr/local/share/zsh/site-functions/_completion_derive
+//! $ compinit
+//! $ ./target/debug/examples/completion_derive --<TAB>
+//! ```
+//! fish:
+//! ```console
+//! $ cargo run --example completion-derive -- --generate=fish > completion_derive.fish
+//! $ . ./completion_derive.fish
+//! $ ./target/debug/examples/completion_derive --<TAB>
+//! ```
+use clap::{Args, Command, CommandFactory, Parser, Subcommand, ValueHint};
+use clap_complete::{generate, Generator, Shell};
+use std::ffi::OsString;
+use std::io;
+use std::path::PathBuf;
+
+#[derive(Parser, Debug, PartialEq)]
+#[command(name = "completion-derive")]
+struct Opt {
+ // If provided, outputs the completion file for given shell
+ #[arg(long = "generate", value_enum)]
+ generator: Option<Shell>,
+ #[command(subcommand)]
+ command: Option<Commands>,
+}
+
+#[derive(Subcommand, Debug, PartialEq)]
+enum Commands {
+ #[command(visible_alias = "hint")]
+ ValueHint(ValueHintOpt),
+}
+
+#[derive(Args, Debug, PartialEq)]
+struct ValueHintOpt {
+ // Showcasing all possible ValueHints:
+ #[arg(long, value_hint = ValueHint::Unknown)]
+ unknown: Option<String>,
+ #[arg(long, value_hint = ValueHint::Other)]
+ other: Option<String>,
+ #[arg(short, long, value_hint = ValueHint::AnyPath)]
+ path: Option<PathBuf>,
+ #[arg(short, long, value_hint = ValueHint::FilePath)]
+ file: Option<PathBuf>,
+ #[arg(short, long, value_hint = ValueHint::DirPath)]
+ dir: Option<PathBuf>,
+ #[arg(short, long, value_hint = ValueHint::ExecutablePath)]
+ exe: Option<PathBuf>,
+ #[arg(long, value_hint = ValueHint::CommandName)]
+ cmd_name: Option<OsString>,
+ #[arg(short, long, value_hint = ValueHint::CommandString)]
+ cmd: Option<String>,
+ // Command::trailing_var_ar is required to use ValueHint::CommandWithArguments
+ #[arg(trailing_var_arg = true, value_hint = ValueHint::CommandWithArguments)]
+ command_with_args: Vec<String>,
+ #[arg(short, long, value_hint = ValueHint::Username)]
+ user: Option<String>,
+ #[arg(long, value_hint = ValueHint::Hostname)]
+ host: Option<String>,
+ #[arg(long, value_hint = ValueHint::Url)]
+ url: Option<String>,
+ #[arg(long, value_hint = ValueHint::EmailAddress)]
+ email: Option<String>,
+}
+
+fn print_completions<G: Generator>(gen: G, cmd: &mut Command) {
+ generate(gen, cmd, cmd.get_name().to_string(), &mut io::stdout());
+}
+
+fn main() {
+ let opt = Opt::parse();
+
+ if let Some(generator) = opt.generator {
+ let mut cmd = Opt::command();
+ eprintln!("Generating completion file for {generator:?}...");
+ print_completions(generator, &mut cmd);
+ } else {
+ println!("{opt:#?}");
+ }
+}