docs(example): Added repl derive example

This commit is contained in:
Eric R 2024-01-23 17:35:15 -05:00
parent 470c636bc0
commit a6391ae9e3
5 changed files with 134 additions and 1 deletions

View file

@ -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
View 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
View 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(())
}

View file

@ -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;

View file

@ -0,0 +1,7 @@
//! # Example: REPL (Derive API)
//!
//! ```rust
#![doc = include_str!("../../examples/repl-derive.rs")]
//! ```
//!
#![doc = include_str!("../../examples/repl-derive.md")]