ibuilder 0.1.8

Interactive builder for Rust types
Documentation
#![allow(dead_code)]

use ibuilder::nodes::{FieldKind, Node};
use ibuilder::*;

#[derive(IBuilder, Eq, PartialEq, Debug)]
struct Struct {
    #[ibuilder(hidden, default = 42)]
    field: i32,
    enm: Enum,
}

#[derive(Clone, Eq, PartialEq, Debug)]
struct Defaultable {
    field: String,
}

impl Default for Defaultable {
    fn default() -> Self {
        Defaultable {
            field: "success".into(),
        }
    }
}

#[derive(IBuilder, Eq, PartialEq, Debug)]
struct StructWithoutDefault {
    #[ibuilder(hidden)]
    field: Defaultable,
    field2: i32,
}

#[derive(IBuilder, Eq, PartialEq, Debug)]
enum Enum {
    #[ibuilder(hidden)]
    Var1,
    Var2 {
        field: i32,
    },
    Var3(i32),
}

#[test]
fn hidden_variant() {
    let mut builder = Enum::builder();

    let options = builder.get_options();
    let mut choices = options.choices.iter().map(|c| c.text.as_str());
    assert!(!choices.any(|x| x == "Var1"));

    assert_eq!(
        builder.choose(Input::choice("Var1")),
        Err(ChooseError::UnexpectedChoice)
    );
}

#[test]
fn hidden_field() {
    let mut builder = Struct::builder();

    let options = builder.get_options();
    let mut choices = options.choices.iter().map(|c| c.text.as_str());
    assert!(!choices.any(|x| x == "field"));

    assert_eq!(
        builder.choose(Input::choice("field")),
        Err(ChooseError::UnexpectedChoice)
    );

    let node = builder.to_node();
    match node {
        Node::Leaf(_) => panic!("expecting a composite"),
        Node::Composite(_, fields) => {
            assert_eq!(fields.len(), 1);
            match &fields[0] {
                FieldKind::Named(name, _) => {
                    assert_ne!(name, "field");
                }
                FieldKind::Unnamed(_) => panic!("expecting named"),
            }
        }
    }
}

#[test]
fn hidden_field_without_default() {
    let mut builder = StructWithoutDefault::builder();

    let options = builder.get_options();
    let mut choices = options.choices.iter().map(|c| c.text.as_str());
    assert!(!choices.any(|x| x == "field"));

    assert_eq!(
        builder.choose(Input::choice("field")),
        Err(ChooseError::UnexpectedChoice)
    );

    let node = builder.to_node();
    match node {
        Node::Leaf(_) => panic!("expecting a composite"),
        Node::Composite(_, fields) => {
            assert_eq!(fields.len(), 1);
            match &fields[0] {
                FieldKind::Named(name, _) => {
                    assert_ne!(name, "field");
                }
                FieldKind::Unnamed(_) => panic!("expecting named"),
            }
        }
    }

    builder.choose(Input::choice("field2")).unwrap();
    builder.choose(Input::text("42")).unwrap();

    let res = builder.finalize().unwrap();
    assert_eq!(res.field.field, "success");
}