modcli/output/input/
text.rs1use crate::output::print;
2use std::io::{stdin, stdout, Write};
3
4pub fn prompt_text(message: &str) -> String {
10 prompt_text_with_validation(message, |_| Ok(()))
11}
12
13pub fn prompt_text_with_validation<F>(message: &str, validator: F) -> String
19where
20 F: Fn(&str) -> Result<(), &str>,
21{
22 let mut input = String::new();
23 loop {
24 print!("{message}: ");
25 if let Err(e) = stdout().flush() {
26 print::warn(&format!("flush failed: {e}"));
27 }
28 input.clear();
29 if let Err(e) = stdin().read_line(&mut input) {
30 print::error(&format!("Error reading input: {e}. Try again."));
31 continue;
32 }
33 let trimmed = input.trim();
34
35 match validator(trimmed) {
36 Ok(_) => return trimmed.to_string(),
37 Err(err) => print::status(&format!("Invalid input: {err}")),
38 }
39 }
40}