mirror of
https://github.com/clap-rs/clap
synced 2024-12-13 14:22:34 +00:00
docs(example): Added repl derive example
This commit is contained in:
parent
470c636bc0
commit
a6391ae9e3
5 changed files with 134 additions and 1 deletions
|
@ -159,6 +159,11 @@ name = "repl"
|
||||||
path = "examples/repl.rs"
|
path = "examples/repl.rs"
|
||||||
required-features = ["help"]
|
required-features = ["help"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "repl-derive"
|
||||||
|
path = "examples/repl-derive.rs"
|
||||||
|
required-features = ["derive"]
|
||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
name = "01_quick"
|
name = "01_quick"
|
||||||
path = "examples/tutorial_builder/01_quick.rs"
|
path = "examples/tutorial_builder/01_quick.rs"
|
||||||
|
|
41
examples/repl-derive.md
Normal file
41
examples/repl-derive.md
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
**This requires enabling the [`derive` feature flag][crate::_features].**
|
||||||
|
|
||||||
|
Help:
|
||||||
|
```console
|
||||||
|
$ echo --help
|
||||||
|
Usage: echo --text <TEXT>
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help Print help
|
||||||
|
|
||||||
|
Echo:
|
||||||
|
-t, --text <TEXT> The text to be echoed [aliases: text]
|
||||||
|
$ ping --help
|
||||||
|
Usage: ping
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help Print help
|
||||||
|
$ exit --help
|
||||||
|
Usage: exit
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help Print help
|
||||||
|
```
|
||||||
|
|
||||||
|
Echo:
|
||||||
|
```console
|
||||||
|
$ echo -t 'Hello, world!'
|
||||||
|
Hello, world!
|
||||||
|
```
|
||||||
|
|
||||||
|
Ping:
|
||||||
|
```console
|
||||||
|
$ ping
|
||||||
|
pong
|
||||||
|
```
|
||||||
|
|
||||||
|
Exit:
|
||||||
|
```console
|
||||||
|
$ exit
|
||||||
|
Exiting ...
|
||||||
|
```
|
79
examples/repl-derive.rs
Normal file
79
examples/repl-derive.rs
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
|
use clap::{Args, Parser, Subcommand};
|
||||||
|
|
||||||
|
#[derive(Debug, Parser)]
|
||||||
|
#[command(multicall = true)]
|
||||||
|
struct Cli {
|
||||||
|
#[command(subcommand)]
|
||||||
|
command: Commands,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Subcommand)]
|
||||||
|
enum Commands {
|
||||||
|
Echo(EchoArgs),
|
||||||
|
Ping,
|
||||||
|
Exit,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Args, Debug)]
|
||||||
|
pub struct EchoArgs {
|
||||||
|
#[arg(
|
||||||
|
short = 't',
|
||||||
|
long = "text",
|
||||||
|
visible_alias = "text",
|
||||||
|
help = "The text to be echoed",
|
||||||
|
help_heading = "Echo",
|
||||||
|
)]
|
||||||
|
text: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn respond(line: &str) -> Result<bool, String> {
|
||||||
|
let args = shlex::split(line).ok_or("error: Invalid quoting")?;
|
||||||
|
let cli = Cli::try_parse_from(args).map_err(|e| e.to_string())?;
|
||||||
|
match cli.command {
|
||||||
|
Commands::Echo(args) => {
|
||||||
|
println!("{}", args.text);
|
||||||
|
}
|
||||||
|
Commands::Ping => {
|
||||||
|
println!("Pong");
|
||||||
|
}
|
||||||
|
Commands::Exit => {
|
||||||
|
println!("Exiting ...");
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn readline() -> Result<String, String> {
|
||||||
|
write!(std::io::stdout(), "$ ").map_err(|e| e.to_string())?;
|
||||||
|
std::io::stdout().flush().map_err(|e| e.to_string())?;
|
||||||
|
let mut buffer = String::new();
|
||||||
|
std::io::stdin()
|
||||||
|
.read_line(&mut buffer)
|
||||||
|
.map_err(|e| e.to_string())?;
|
||||||
|
Ok(buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), String> {
|
||||||
|
loop {
|
||||||
|
let line = readline()?;
|
||||||
|
let line = line.trim();
|
||||||
|
if line.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
match respond(line) {
|
||||||
|
Ok(quit) => {
|
||||||
|
if quit {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
write!(std::io::stdout(), "{err}").map_err(|e| e.to_string())?;
|
||||||
|
std::io::stdout().flush().map_err(|e| e.to_string())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
|
@ -43,7 +43,7 @@
|
||||||
//! - Topics:
|
//! - Topics:
|
||||||
//! - Subcommands
|
//! - Subcommands
|
||||||
//!
|
//!
|
||||||
//! repl: [builder][repl]
|
//! repl: [builder][repl], [derive][repl_derive]
|
||||||
//! - Topics:
|
//! - Topics:
|
||||||
//! - Read-Eval-Print Loops / Custom command lines
|
//! - Read-Eval-Print Loops / Custom command lines
|
||||||
|
|
||||||
|
@ -58,4 +58,5 @@ pub mod multicall_busybox;
|
||||||
pub mod multicall_hostname;
|
pub mod multicall_hostname;
|
||||||
pub mod pacman;
|
pub mod pacman;
|
||||||
pub mod repl;
|
pub mod repl;
|
||||||
|
pub mod repl_derive;
|
||||||
pub mod typed_derive;
|
pub mod typed_derive;
|
||||||
|
|
7
src/_cookbook/repl_derive.rs
Normal file
7
src/_cookbook/repl_derive.rs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
//! # Example: REPL (Derive API)
|
||||||
|
//!
|
||||||
|
//! ```rust
|
||||||
|
#![doc = include_str!("../../examples/repl-derive.rs")]
|
||||||
|
//! ```
|
||||||
|
//!
|
||||||
|
#![doc = include_str!("../../examples/repl-derive.md")]
|
Loading…
Reference in a new issue