pub struct Form<T>(/* private fields */);
Expand description
A data guard for FromForm
types.
This type implements the FromData
trait. It provides a generic means to
parse arbitrary structures from incoming form data.
See the forms guide for general form support documentation.
§Leniency
A Form<T>
will parse successfully from an incoming form if the form
contains a superset of the fields in T
. Said another way, a Form<T>
automatically discards extra fields without error. For instance, if an
incoming form contains the fields “a”, “b”, and “c” while T
only contains
“a” and “c”, the form will parse as Form<T>
. To parse strictly, use the
Strict
form guard.
§Usage
This type can be used with any type that implements the FromForm
trait.
The trait can be automatically derived; see the FromForm
documentation
for more information on deriving or implementing the trait.
Because Form
implements FromData
, it can be used directly as a target of
the data = "<param>"
route parameter as long as its generic type
implements the FromForm
trait:
use rocket::form::Form;
use rocket::http::RawStr;
#[derive(FromForm)]
struct UserInput<'r> {
value: &'r str
}
#[post("/submit", data = "<user_input>")]
fn submit_task(user_input: Form<UserInput<'_>>) -> String {
format!("Your value: {}", user_input.value)
}
A type of Form<T>
automatically dereferences into an &T
or &mut T
,
though you can also transform a Form<T>
into a T
by calling
into_inner()
. Thanks to automatic dereferencing, you
can access fields of T
transparently through a Form<T>
, as seen above
with user_input.value
.
§Errors
A Form<T>
data guard may fail, forward, or succeed.
If a request’s content-type is neither ContentType::Form
nor
ContentType::FormData
, the guard forwards.
If the request ContentType
does identify as a form but the form data
does not parse as T
, according to T
’s FromForm
implementation, the
guard fails. The Error
variant contains a vector of the Errors
emitted by T
’s FromForm
parser. If the error is not caught by a
form::Result<T>
or Option<Form<T>>
data guard, the status code
is set to Errors::status()
, and the corresponding error catcher is
called.
Otherwise the guard succeeds.
§Data Limits
The total amount of data accepted by the Form
data guard is limited by the
following limits:
Limit Name | Default | Description |
---|---|---|
form | 32KiB | total limit for url-encoded forms |
data-form | 2MiB | total limit for multipart forms |
* | N/A | each field type has its own limits |
As noted above, each form field type (a form guard) typically imposes its
own limits. For example, the &str
form guard imposes a data limit of
string
when multipart data is streamed.
§URL-Encoded Forms
The form
limit specifies the data limit for an entire url-encoded form
data. It defaults to 32KiB. URL-encoded form data is percent-decoded, stored
in-memory, and parsed into ValueField
s. If the incoming data exceeds
this limit, the Form
data guard fails without attempting to parse fields
with a 413: Payload Too Large
error.
§Multipart Forms
The data-form
limit specifies the data limit for an entire multipart form
data stream. It defaults to 2MiB. Multipart data is streamed, and form
fields are processed into DataField
s or ValueField
s as they arrive.
If the commutative data received while streaming exceeds the limit, parsing
is aborted, an error is created and pushed via FromForm::push_error()
,
and the form is finalized.
§Individual Fields
Individual fields may have data limits as well. The type of the field
determines whether there is a data limit. For instance, the &str
type
imposes the string
data limit. Consult the type’s documentation or
FromFormField
for details.
§Changing Limits
To change data limits, set the limits.form
and/or limits.data-form
configuration parameters. For instance, to increase the URL-encoded forms
limit to 128KiB for all environments, you might add the following to your
Rocket.toml
:
[global.limits]
form = 128KiB
Implementations§
Source§impl<T> Form<T>
impl<T> Form<T>
Sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Consumes self
and returns the inner value.
Note that since Form
implements Deref
and DerefMut
with
target T
, reading and writing an inner value can be accomplished
transparently.
§Example
use rocket::form::Form;
#[derive(FromForm)]
struct MyForm {
field: String,
}
#[post("/submit", data = "<form>")]
fn submit(form: Form<MyForm>) -> String {
// We can read or mutate a value transparently:
let field: &str = &form.field;
// To gain ownership, however, use `into_inner()`:
form.into_inner().field
}
Source§impl<'r, T: FromForm<'r>> Form<T>
impl<'r, T: FromForm<'r>> Form<T>
Sourcepub fn parse(string: &'r str) -> Result<'r, T>
pub fn parse(string: &'r str) -> Result<'r, T>
Leniently parses a T
from a percent-decoded
x-www-form-urlencoded
form string. Specifically, this method
implements §5.1 of the WHATWG URL Living Standard with the exception
of steps 3.4 and 3.5, which are assumed to already be reflected in
string
, and then parses the fields as T
.
§Example
use rocket::form::{Form, FromForm};
#[derive(FromForm)]
struct Pet<'r> {
name: &'r str,
wags: bool,
}
let string = "name=Benson Wagger!&wags=true";
let pet: Pet<'_> = Form::parse(string).unwrap();
assert_eq!(pet.name, "Benson Wagger!");
assert_eq!(pet.wags, true);
Sourcepub fn parse_iter<I>(fields: I) -> Result<'r, T>where
I: IntoIterator<Item = ValueField<'r>>,
pub fn parse_iter<I>(fields: I) -> Result<'r, T>where
I: IntoIterator<Item = ValueField<'r>>,
Leniently parses a T
from the percent-decoded fields
.
Specifically, this method implements §5.1 of the WHATWG URL Living
Standard with the exception of step 3.
§Example
use rocket::form::{Form, FromForm, ValueField};
#[derive(FromForm)]
struct Pet<'r> {
name: &'r str,
wags: bool,
}
let fields = vec![
ValueField::parse("name=Bob, the cat. :)"),
ValueField::parse("wags=no"),
];
let pet: Pet<'_> = Form::parse_iter(fields).unwrap();
assert_eq!(pet.name, "Bob, the cat. :)");
assert_eq!(pet.wags, false);
Source§impl<T: for<'a> FromForm<'a> + 'static> Form<T>
impl<T: for<'a> FromForm<'a> + 'static> Form<T>
Sourcepub fn parse_encoded(string: &RawStr) -> Result<'static, T>
pub fn parse_encoded(string: &RawStr) -> Result<'static, T>
Leniently parses a T
from a raw, x-www-form-urlencoded
form string.
Specifically, this method implements §5.1 of the WHATWG URL Living
Standard. Because percent-decoding might modify the input string, the
output type T
must be 'static
.
§Example
use rocket::http::RawStr;
use rocket::form::{Form, FromForm};
#[derive(FromForm)]
struct Pet {
name: String,
wags: bool,
}
let string = RawStr::new("name=Benson+Wagger%21&wags=true");
let pet: Pet = Form::parse_encoded(string).unwrap();
assert_eq!(pet.name, "Benson Wagger!");
assert_eq!(pet.wags, true);
Source§impl Form<()>
impl Form<()>
Sourcepub fn values(string: &str) -> impl Iterator<Item = ValueField<'_>>
pub fn values(string: &str) -> impl Iterator<Item = ValueField<'_>>
Returns an iterator of fields parsed from a x-www-form-urlencoded
form
string. Specifically, this method implements steps 1, 2, and 3.1 - 3.3
of §5.1 of the WHATWG URL Living Standard. Fields in the returned
iterator are not percent-decoded.
§Example
use rocket::form::{Form, ValueField};
let string = "name=Bobby Brown&&&email=me@rocket.rs";
let mut values = Form::values(string);
assert_eq!(values.next().unwrap(), ValueField::parse("name=Bobby Brown"));
assert_eq!(values.next().unwrap(), ValueField::parse("email=me@rocket.rs"));
assert!(values.next().is_none());
Trait Implementations§
Source§impl<'r, T: FromForm<'r>> FromData<'r> for Form<T>
impl<'r, T: FromForm<'r>> FromData<'r> for Form<T>
Source§fn from_data<'life0, 'async_trait>(
req: &'r Request<'life0>,
data: Data<'r>,
) -> Pin<Box<dyn Future<Output = Outcome<'r, Self>> + Send + 'async_trait>>where
Self: 'async_trait,
'r: 'async_trait,
'life0: 'async_trait,
fn from_data<'life0, 'async_trait>(
req: &'r Request<'life0>,
data: Data<'r>,
) -> Pin<Box<dyn Future<Output = Outcome<'r, Self>> + Send + 'async_trait>>where
Self: 'async_trait,
'r: 'async_trait,
'life0: 'async_trait,
Self
from the incoming request body data. Read moreSource§impl<T: Ord> Ord for Form<T>
impl<T: Ord> Ord for Form<T>
Source§impl<T: PartialOrd> PartialOrd for Form<T>
impl<T: PartialOrd> PartialOrd for Form<T>
impl<T: Eq> Eq for Form<T>
impl<T> StructuralPartialEq for Form<T>
Auto Trait Implementations§
impl<T> Freeze for Form<T>where
T: Freeze,
impl<T> RefUnwindSafe for Form<T>where
T: RefUnwindSafe,
impl<T> Send for Form<T>where
T: Send,
impl<T> Sync for Form<T>where
T: Sync,
impl<T> Unpin for Form<T>where
T: Unpin,
impl<T> UnwindSafe for Form<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> AsAny for Twhere
T: Any,
impl<T> AsAny for Twhere
T: Any,
fn as_any_ref(&self) -> &(dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.bright_black());
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.bright_green());
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.bright_yellow());
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.bright_magenta());
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.bright_white());
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
§Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.on_bright_black());
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.on_bright_green());
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.on_bright_yellow());
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlue
.
§Example
println!("{}", value.on_bright_blue());
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.on_bright_magenta());
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightCyan
.
§Example
println!("{}", value.on_bright_cyan());
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.on_bright_white());
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
§Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
Source§fn underline(&self) -> Painted<&T>
fn underline(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::Underline
.
§Example
println!("{}", value.underline());
Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::RapidBlink
.
§Example
println!("{}", value.rapid_blink());
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);