kwaak 0.8.2

Run a team of autonomous agents on your code, right from your terminal
Documentation
use anyhow::Result;

pub fn prompt_text<'a>(prompt: &'a str, default: Option<&'a str>) -> inquire::Text<'a> {
    let mut prompt = inquire::Text::new(prompt);

    if let Some(default) = default {
        prompt = prompt.with_default(default);
    }

    prompt
}

pub fn prompt_api_key<'a>(prompt: &'a str, default: Option<&'a str>) -> inquire::Text<'a> {
    let mut prompt = inquire::Text::new(prompt).with_validator(|input: &str| {
        if input.starts_with("env:") || input.starts_with("file:") {
            Ok(inquire::validator::Validation::Valid)
        } else {
            Ok(inquire::validator::Validation::Invalid(
                "API keys must start with `env:` or `file:`".into(),
            ))
        }
    });

    if let Some(default) = default {
        prompt = prompt.with_default(default);
    }

    prompt
}

#[allow(clippy::needless_pass_by_value)]
pub fn prompt_select<T>(prompt: &str, options: Vec<T>, default: Option<T>) -> Result<String>
where
    T: std::fmt::Display + std::cmp::PartialEq + Clone,
{
    let mut prompt = inquire::Select::new(prompt, options.clone());

    if let Some(default) = default {
        debug_assert!(
            options.contains(&default),
            "{} is not in the list of options, valid: {}",
            default,
            options
                .iter()
                .map(ToString::to_string)
                .collect::<Vec<_>>()
                .join(", ")
        );
        if let Some(idx) = options.iter().position(|l| l == &default) {
            prompt = prompt.with_starting_cursor(idx);
        }
    }

    Ok(prompt.prompt()?.to_string())
}