Skip to content

Commit

Permalink
Merge pull request #5328 from eddique/master
Browse files Browse the repository at this point in the history
docs(example): Added repl derive example
  • Loading branch information
epage authored Jan 24, 2024
2 parents 470c636 + fcab81a commit 99470c4
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 1 deletion.
5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,11 @@ name = "repl"
path = "examples/repl.rs"
required-features = ["help"]

[[example]]
name = "repl-derive"
path = "examples/repl-derive.rs"
required-features = ["derive"]

[[example]]
name = "01_quick"
path = "examples/tutorial_builder/01_quick.rs"
Expand Down
67 changes: 67 additions & 0 deletions examples/repl-derive.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
use std::io::Write;

use clap::{Parser, Subcommand};

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

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::Ping => {
write!(std::io::stdout(), "Pong").map_err(|e| e.to_string())?;
std::io::stdout().flush().map_err(|e| e.to_string())?;
}
Commands::Exit => {
write!(std::io::stdout(), "Exiting ...").map_err(|e| e.to_string())?;
std::io::stdout().flush().map_err(|e| e.to_string())?;
return Ok(true);
}
}
Ok(false)
}

#[derive(Debug, Parser)]
#[command(multicall = true)]
struct Cli {
#[command(subcommand)]
command: Commands,
}

#[derive(Debug, Subcommand)]
enum Commands {
Ping,
Exit,
}

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)
}
3 changes: 2 additions & 1 deletion src/_cookbook/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
//! - Topics:
//! - Subcommands
//!
//! repl: [builder][repl]
//! repl: [builder][repl], [derive][repl_derive]
//! - Topics:
//! - Read-Eval-Print Loops / Custom command lines
Expand All @@ -58,4 +58,5 @@ pub mod multicall_busybox;
pub mod multicall_hostname;
pub mod pacman;
pub mod repl;
pub mod repl_derive;
pub mod typed_derive;
4 changes: 4 additions & 0 deletions src/_cookbook/repl_derive.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
//! # Example: REPL (Derive API)
//!
//! ```rust
#![doc = include_str!("../../examples/repl-derive.rs")]

0 comments on commit 99470c4

Please sign in to comment.