ibuilder 0.1.8

Interactive builder for Rust types
Documentation
#![allow(clippy::box_vec, clippy::type_complexity)]

use ibuilder::*;
use rand::prelude::*;

#[derive(Debug, IBuilder)]
struct Base {
    integer: i32,
    #[ibuilder(default = 42)]
    defaulted: i32,
    inner: Inner,
    #[ibuilder(rename = "enum")]
    en: Enum,
}

#[derive(Debug, IBuilder)]
#[ibuilder(rename = "inner inner inner")]
struct Inner {
    string: Option<String>,
    #[ibuilder(default = "lol")]
    defaulted: String,
}

#[derive(Debug, IBuilder)]
#[ibuilder(prompt = "WHAAT??!")]
enum Enum {
    #[ibuilder(rename = "hello")]
    Var1,
    Var2 {
        #[ibuilder(hidden, default = "nope")]
        field: String,
        #[ibuilder(rename = "baz")]
        field2: Inner,
    },
    Var3(Inner),
    #[ibuilder(rename = "man! this field is strange!")]
    Var4(Vec<Vec<Option<Box<Vec<Box<Box<Base>>>>>>>),
}

#[test]
fn random() {
    let mut builder = Base::builder();
    const N_ITER: usize = 10_000;
    let mut rng = rand::thread_rng();

    for _ in 0..N_ITER {
        let options = builder.get_options();
        if options.text_input && rand::random() {
            let input = rand::random::<i32>().to_string();
            builder.choose(Input::text(&input)).unwrap_or_else(|e| {
                panic!(
                    "Failed to choose text '{}': {}\nBuilder: {:#?}",
                    input, e, builder
                )
            });
        } else if rand::random() {
            let res = builder.choose(Input::choice("totally not a valid choice"));
            if res.as_ref().unwrap_err() != &ChooseError::UnexpectedChoice {
                panic!(
                    "Expecting ChooseError::UnexpectedChoice, but got: {:?}",
                    res
                );
            }
            let options = builder.get_options();
            if !options.text_input {
                let res = builder.choose(Input::text("surprise! some text!"));
                if res.as_ref().unwrap_err() != &ChooseError::UnexpectedText {
                    panic!("Expecting ChooseError::UnexpectedText, but got: {:?}", res);
                }
            }
        } else {
            let choice = options.choices.choose(&mut rng).expect("Empty choices");
            builder
                .choose(Input::choice(&choice.choice_id))
                .unwrap_or_else(|e| {
                    panic!(
                        "Failed to choose option {:?}: {}\nBuilder: {:#?}",
                        choice, e, builder
                    )
                });
        }
    }
}