pub struct Rule<'a, R, V, E: PartialEq + Eq + Send + Sync> { /* private fields */ }Expand description
Binds a KpType (from #[derive(Kp)]) to a root value and a list of validation predicates.
Each rule is a bool predicate plus an E value returned when the predicate is
false.
§Semantics
- Mandatory rules run in order. The first predicate that returns
falsestops the run;applyreturnsvec![that rule’s E]. - Non-mandatory rules run in parallel (Rayon). Each predicate that returns
falsecontributes itsE; passing rules produce no entry. The result may be empty if all pass.
§Examples
use key_paths_derive::Kp;
use par_validator::builder::Rule;
#[derive(Kp)]
struct Invoice {
reference: String,
}
fn non_blank(r: Option<&String>) -> bool {
r.map(|s| !s.trim().is_empty()).unwrap_or(false)
}
fn len_at_most_8(r: Option<&String>) -> bool {
r.map(|s| s.len() <= 8).unwrap_or(false)
}
let inv = Invoice {
reference: "INV-01".into(),
};
let failures: Vec<&'static str> = Rule::new(Invoice::reference())
.with_root(&inv)
.mandatory_rule(non_blank, "reference_blank")
.rule(len_at_most_8, "reference_too_long")
.apply();
assert!(failures.is_empty());
let bad = Invoice {
reference: "TOO_LONG_REFERENCE".into(),
};
let failures = Rule::new(Invoice::reference())
.with_root(&bad)
.mandatory_rule(non_blank, "reference_blank")
.rule(len_at_most_8, "reference_too_long")
.apply();
assert_eq!(failures, vec!["reference_too_long"]);Implementations§
Source§impl<'a, R, V, E> Rule<'a, R, V, E>
impl<'a, R, V, E> Rule<'a, R, V, E>
Sourcepub fn new(kp: KpType<'a, R, V>) -> Self
pub fn new(kp: KpType<'a, R, V>) -> Self
Starts a builder for the given statically dispatched key path (#[derive(Kp)] fields).
Sourcepub fn with_root(self, root: &'a R) -> Self
pub fn with_root(self, root: &'a R) -> Self
Supply the struct instance root that the key path reads from.
Sourcepub fn rule(self, f: fn(Option<&'a V>) -> bool, e: E) -> Self
pub fn rule(self, f: fn(Option<&'a V>) -> bool, e: E) -> Self
Append a rule executed in parallel with other non-mandatory rules when you call
apply.
Auto Trait Implementations§
impl<'a, R, V, E> Freeze for Rule<'a, R, V, E>
impl<'a, R, V, E> RefUnwindSafe for Rule<'a, R, V, E>
impl<'a, R, V, E> Send for Rule<'a, R, V, E>where
R: Sync,
impl<'a, R, V, E> Sync for Rule<'a, R, V, E>where
R: Sync,
impl<'a, R, V, E> Unpin for Rule<'a, R, V, E>
impl<'a, R, V, E> UnsafeUnpin for Rule<'a, R, V, E>
impl<'a, R, V, E> !UnwindSafe for Rule<'a, R, V, E>
Blanket Implementations§
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
Mutably borrows from an owned value. Read more
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>
Converts
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>
Converts
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 more