1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
use std::io;
use http::RawStr;
/// Error returned by the [`FromForm`](::request::FromForm) derive on form
/// parsing errors.
///
/// If multiple errors occur while parsing a form, the first error in the
/// following precedence, from highest to lowest, is returned:
///
/// * `BadValue` or `Unknown` in incoming form string field order
/// * `Missing` in lexical field order
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum FormParseError<'f> {
/// The field named `.0` with value `.1` failed to parse or validate.
BadValue(&'f RawStr, &'f RawStr),
/// The parse was strict and the field named `.0` with value `.1` appeared
/// in the incoming form string but was unexpected.
///
/// This error cannot occur when parsing is lenient.
Unknown(&'f RawStr, &'f RawStr),
/// The field named `.0` was expected but is missing in the incoming form.
Missing(&'f RawStr),
}
/// Error returned by the [`FromData`](::data::FromData) implementations of
/// [`Form`](::request::Form) and [`LenientForm`](::request::LenientForm).
#[derive(Debug)]
pub enum FormDataError<'f, E> {
/// An I/O error occurred while reading reading the data stream. This can
/// also mean that the form contained invalid UTF-8.
Io(io::Error),
/// The form string (in `.0`) is malformed and was unable to be parsed as
/// HTTP `application/x-www-form-urlencoded` data.
Malformed(&'f str),
/// The form string (in `.1`) failed to parse as the intended structure. The
/// error type in `.0` contains further details.
Parse(E, &'f str)
}
/// Alias to the type of form errors returned by the [`FromData`]
/// implementations of [`Form<T>`] where the [`FromForm`] implementation for `T`
/// was derived.
///
/// This alias is particularly useful when "catching" form errors in routes.
///
/// [`FromData`]: ::data::FromData
/// [`Form<T>`]: ::request::Form
/// [`FromForm`]: ::request::FromForm
///
/// # Example
///
/// ```rust
/// # #![feature(proc_macro_hygiene, decl_macro)]
/// # #[macro_use] extern crate rocket;
/// use rocket::request::{Form, FormError, FormDataError};
///
/// #[derive(FromForm)]
/// struct Input {
/// value: String,
/// }
///
/// #[post("/", data = "<sink>")]
/// fn submit(sink: Result<Form<Input>, FormError>) -> String {
/// match sink {
/// Ok(form) => form.into_inner().value,
/// Err(FormDataError::Io(_)) => "I/O error".into(),
/// Err(FormDataError::Malformed(f)) | Err(FormDataError::Parse(_, f)) => {
/// format!("invalid form input: {}", f)
/// }
/// }
/// }
/// # fn main() {}
/// ```
pub type FormError<'f> = FormDataError<'f, FormParseError<'f>>;