Actions (Submits)

#[submit] handlers process form POSTs with typed validation and field-level errors.

Define a submit handler

#[derive(Deserialize)]
struct ContactForm {
    email: String,
    message: String,
}

#[submit]
async fn contact(form: ContactForm, _req: &FlowRequest)
    -> Result<ContactResult, SubmitError>
{
    if form.email.is_empty() {
        return Err(SubmitError::new("Fix errors")
            .field("email", "Required"));
    }
    Ok(ContactResult { ok: true })
}

Wire to Form

view! {
    <Form submit={contact}>
        <input name="email" type="email" />
        <textarea name="message"></textarea>
        <button type="submit">"Send"</button>
    </Form>
}

SubmitError

Return structured validation errors. The runtime maps field_errors to form fields when using client enhancement.

SubmitError::new("Invalid input")
    .field("email", "Must be a valid email")
    .field("message", "Too short")

HTTP endpoint

Forms POST to /_resuma/submit/:name. Works without JavaScript via standard form submission.