vale 0.0.0

A simple entity validation library
Documentation
#![feature(decl_macro)]

extern crate rkt as rocket;

use rkt_contrib::json::Json;
use rkt::http::Status;

#[derive(vale::Validate)]
#[derive(serde::Serialize, serde::Deserialize)]
struct Struct {
    #[validate(gt(10))]
    value: u32,
    #[validate(len_gt(3))]
    string: String,
    #[validate(eq(true))]
    boolean: bool,
    #[validate(with(is_even))]
    even_value: i32,
    #[validate(trim, len_lt(10), to_lower_case)]
    transformer: String,
    #[validate(len_lt(10), trim)]
    transfailer: String,
}

fn is_even(arg: &mut i32) -> bool {
    *arg % 2 == 0
}

fn valid_struct() -> Struct {
    Struct {
        value: 12,
        string: "String".to_string(),
        boolean: true,
        even_value: 2,
        transformer: "hello".to_string(),
        transfailer: "hello".to_string(),
    }
}

#[rocket::post("/", data = "<to_validate>")]
fn route(to_validate: vale::Valid<Json<Struct>>) -> rkt_contrib::json::Json<Struct> {
    rkt_contrib::json::Json(to_validate.into_inner().into_inner())
}

fn test_rocket() -> rocket::Rocket {
    rocket::ignite().mount("/", rocket::routes![route])
}

#[test]
fn test_valid() {
    let s = valid_struct();

    let rocket = test_rocket();
    let client = rkt::local::Client::new(rocket).unwrap();
    let resp = client
        .post("/")
        .body(serde_json::to_string(&s).unwrap())
        .dispatch();
    assert_eq!(resp.status(), Status::Ok)
}

#[test]
fn test_too_small() {
    let mut s = valid_struct();
    s.value = 8;

    let rocket = test_rocket();
    let client = rkt::local::Client::new(rocket).unwrap();
    let resp = client
        .post("/")
        .body(serde_json::to_string(&s).unwrap())
        .dispatch();
    assert_eq!(resp.status(), Status::BadRequest)
}

#[test]
fn test_too_short() {
    let mut s = valid_struct();
    s.string = "hi".to_string();

    let rocket = test_rocket();
    let client = rkt::local::Client::new(rocket).unwrap();
    let resp = client
        .post("/")
        .body(serde_json::to_string(&s).unwrap())
        .dispatch();
    assert_eq!(resp.status(), Status::BadRequest)
}

#[test]
fn test_too_false() {
    let mut s = valid_struct();
    s.boolean = false;

    let rocket = test_rocket();
    let client = rkt::local::Client::new(rocket).unwrap();
    let resp = client
        .post("/")
        .body(serde_json::to_string(&s).unwrap())
        .dispatch();
    assert_eq!(resp.status(), Status::BadRequest)
}

#[test]
fn transform() {
    let mut s = valid_struct();
    s.transformer = "     CAST ME       ".to_string();

    let rocket = test_rocket();
    let client = rkt::local::Client::new(rocket).unwrap();
    let resp = client
        .post("/")
        .body(serde_json::to_string(&s).unwrap())
        .dispatch();
    assert_eq!(resp.status(), Status::Ok)
}

#[test]
fn transfail() {
    let mut s = valid_struct();
    s.transfailer = "     CAST ME       ".to_string();

    let rocket = test_rocket();
    let client = rkt::local::Client::new(rocket).unwrap();
    let mut resp = client
        .post("/")
        .body(serde_json::to_string(&s).unwrap())
        .dispatch();
    println!("{:?}", resp.body_string());
    assert_eq!(resp.status(), Status::BadRequest);
}