Validation

Typed form validation in #[submit] with the validator crate.

Install

validator = { version = "0.19", features = ["derive"] }

Submit with Validate trait

use validator::{Validate, ValidationError};

#[derive(Deserialize, Validate)]
struct SignupForm {
    #[validate(email)]
    email: String,
    #[validate(length(min = 8))]
    password: String,
}

#[submit]
async fn signup(form: SignupForm, _req: &FlowRequest) -> Result<(), SubmitError> {
    if let Err(errors) = form.validate() {
        let mut err = SubmitError::new("Fix the errors below.");
        for (field, msgs) in errors.field_errors() {
            if let Some(m) = msgs.first().and_then(|m| m.message.as_ref()) {
                err = err.field(field, m);
            }
        }
        return Err(err);
    }
    db::create_user(&form.email, &form.password).await?;
    Ok(())
}

Field errors map to Form client enhancement automatically. See Actions.