requestty 0.6.3

An easy-to-use collection of interactive cli prompts
Documentation
use requestty::{prompt::*, question::CustomPromptBuilder, Question};

#[derive(Debug)]
struct Validate<'a> {
    message: &'static str,
    prompted: &'a mut bool,
}

impl Prompt for Validate<'_> {
    fn ask(
        self,
        message: String,
        _: &Answers,
        _: &mut dyn Backend,
        _: &mut dyn EventIterator,
    ) -> requestty::Result<Option<Answer>> {
        assert_eq!(message, self.message);
        *self.prompted = true;

        Ok(Some(Answer::Int(0)))
    }
}

fn custom_prompt<'a>(
    name: &str,
    message: &'static str,
    prompted: &'a mut bool,
) -> CustomPromptBuilder<'a> {
    Question::custom(name, Validate { message, prompted })
}

fn prompt_all<'a>(questions: impl IntoIterator<Item = Question<'a>>) {
    requestty::prompt_with(
        questions,
        &mut ui::backend::TestBackend::new((1, 1).into()),
        &mut ui::events::TestEvents::empty(),
    )
    .unwrap();
}

#[test]
fn test_ask_if_answered() {
    let mut prompted_0 = false;
    let mut prompted_1 = false;
    let mut prompted_2 = false;

    prompt_all(vec![
        custom_prompt("name", "message", &mut prompted_0)
            .message("message")
            .build(),
        custom_prompt("name", "message", &mut prompted_1)
            .message("message")
            .build(),
        custom_prompt("name", "message", &mut prompted_2)
            .message("message")
            .ask_if_answered(true)
            .build(),
    ]);

    assert!(prompted_0);
    assert!(!prompted_1);
    assert!(prompted_2);
}

#[test]
fn test_when() {
    let mut prompted_0 = false;
    let mut prompted_1 = false;

    prompt_all(vec![
        custom_prompt("name-0", "message", &mut prompted_0)
            .message("message")
            .when(false)
            .build(),
        custom_prompt("name-1", "message", &mut prompted_1)
            .message("message")
            .when(|ans: &requestty::Answers| !ans.is_empty())
            .build(),
    ]);

    assert!(!prompted_0);
    assert!(!prompted_1);
}

#[test]
fn test_message() {
    let mut prompted_0 = false;
    let mut prompted_1 = false;

    prompt_all(vec![
        custom_prompt("name", "message", &mut prompted_0)
            .message("message")
            .build(),
        custom_prompt("message", "message:", &mut prompted_1).build(),
    ]);

    assert!(prompted_0);
    assert!(prompted_1);
}