pub struct FormState {
pub fields: Vec<FormField>,
pub submitted: bool,
}Expand description
State for a form with multiple fields.
Fields§
§fields: Vec<FormField>Ordered list of form fields.
submitted: boolWhether the form has been successfully submitted.
Implementations§
Source§impl FormState
impl FormState
Sourcepub fn field(self, field: FormField) -> Self
pub fn field(self, field: FormField) -> Self
Add a field and return the updated form for chaining.
Sourcepub fn is_valid(&self) -> bool
pub fn is_valid(&self) -> bool
Whether the form is currently valid — no field holds an error.
Reflects the last run of each field’s validators (auto-triggered by
Context::form_field or run explicitly via
validate_all). It does not re-run validation.
§Example
let mut form = FormState::new().field(FormField::new("Name").validate(validators::required("required")));
assert!(form.is_valid()); // no validation run yet
form.validate_all();
assert!(!form.is_valid()); // empty Name failedSourcepub fn errors(&self) -> Vec<(usize, &str)>
pub fn errors(&self) -> Vec<(usize, &str)>
Collect every current field error as (field_index, message) pairs.
§Example
let mut form = FormState::new().field(FormField::new("Name").validate(validators::required("required")));
form.validate_all();
assert_eq!(form.errors(), vec![(0, "required")]);Sourcepub fn validate_all(&mut self) -> bool
pub fn validate_all(&mut self) -> bool
Run every field’s own validators, returning true when all pass.
This is the replacement for the deprecated positional
validate — validators are co-located with their
fields, so there is no index slice to misalign.
§Example
let mut form = FormState::new()
.field(FormField::new("Email").validate(validators::email()));
let ok = form.validate_all();Sourcepub fn validate_with(
&mut self,
f: impl Fn(&FormState) -> Vec<(usize, String)>,
) -> bool
pub fn validate_with( &mut self, f: impl Fn(&FormState) -> Vec<(usize, String)>, ) -> bool
Apply cross-field validation rules.
The closure receives the whole form and returns (field_index, message)
pairs; each pair sets that field’s error. Returns
true when the closure reports no errors. Useful for rules like
“confirm password must match password”.
§Example
let mut form = FormState::new()
.field(FormField::new("Password"))
.field(FormField::new("Confirm"));
let ok = form.validate_with(|f| {
if f.value(0) != f.value(1) {
vec![(1, "passwords must match".to_string())]
} else {
vec![]
}
});Sourcepub fn validate(&mut self, validators: &[FormValidator]) -> bool
👎Deprecated since 0.21.0: Attach validators per-field via FormField::validate and call validate_all(); positional slices misalign silently.
pub fn validate(&mut self, validators: &[FormValidator]) -> bool
Attach validators per-field via FormField::validate and call validate_all(); positional slices misalign silently.
Validate all fields with a positional slice of function-pointer validators.
Returns true when all validations pass. A field whose index has no
matching validator is silently skipped.