prae 0.8.4

A crate that aims to provide a better way to define types that require validation
Documentation
use assert_matches::assert_matches;
use prae::Wrapper;

prae::define! {
    #[derive(Debug)]
    pub Username: String;
    ensure |u| !u.is_empty();
}

#[test]
fn construction_error_formats_correctly() {
    let err = Username::new("").unwrap_err();
    assert_eq!(
        err.to_string(),
        "failed to construct type Username from value \"\": value is invalid"
    );
}

#[test]
fn mutation_error_formats_correctly() {
    let mut un = Username::new("user").unwrap();
    let err = un.mutate(|u| *u = "".to_owned()).unwrap_err();
    assert_eq!(
        err.to_string(),
        "failed to mutate type Username from value \"user\" to value \"\": value is invalid"
    );
}

#[test]
fn construction_fails_for_invalid_data() {
    assert_matches!(Username::new(""), Err(prae::ConstructionError { .. }));
}

#[test]
fn construction_succeeds_for_valid_data() {
    let un = Username::new(" user ").unwrap();
    assert_eq!(un.get(), " user ");
}

#[test]
fn mutation_fails_for_invalid_data() {
    let mut un = Username::new("user").unwrap();
    assert_matches!(
        un.mutate(|u| *u = "".to_owned()),
        Err(prae::MutationError { .. })
    )
}