A curated set of validators built on top of koruma, organized by domain.
[dependencies]
koruma-collection = { version = "*", features = ["full"] }
use koruma_collection::{collection, format, general, numeric, string};
fmt (default): Display messages for validators.
full: enables optional validator dependencies (url, credit-card, phone-number, email, regex, smallvec).
fluent: enables i18n integration with es-fluent .
full-fluent: full + fluent.
Validator-specific optional flags:
credit-card for format::CreditCardValidation
email for format::EmailValidation
phone-number for format::PhoneNumberValidation
url for format::UrlValidation
regex for string::PatternValidation
smallvec for collection::HasLen support on SmallVec
Validator Rule Example attribute Feature
AlphanumericValidation<T>Only letters and numbers #[koruma(string::AlphanumericValidation::<_>)]always
AsciiValidation<T>ASCII-only input #[koruma(string::AsciiValidation::<_>)]always
ContainsValidation<T>Contains substring #[koruma(string::ContainsValidation::<_>(substring = "abc"))]always
MatchesValidation<T>Equals expected value #[koruma(string::MatchesValidation::<_>(other = "secret".to_string()))]always
PatternValidation<T>Matches regex pattern #[koruma(string::PatternValidation::<_>(pattern = r"^[a-z0-9_]+$"))]regex
PrefixValidation<T>Starts with prefix #[koruma(string::PrefixValidation::<_>(prefix = "usr_"))]always
SuffixValidation<T>Ends with suffix #[koruma(string::SuffixValidation::<_>(suffix = ".rs"))]always
Validator Rule Example attribute Feature
IpValidation<T>Valid IP (Any, V4, V6) #[koruma(format::IpValidation::<_>(kind = format::IpKind::V4))]always
EmailValidation<T>Valid email address #[koruma(format::EmailValidation::<_>)]email
PhoneNumberValidation<T>Valid phone number #[koruma(format::PhoneNumberValidation::<_>)]phone-number
UrlValidation<T>Valid URL #[koruma(format::UrlValidation::<_>)]url
CreditCardValidation<T>Valid credit card number #[koruma(format::CreditCardValidation::<_>)]credit-card
Validator Rule Example attribute Feature
PositiveValidation<T>value > 0#[koruma(numeric::PositiveValidation::<_>)]always
NonNegativeValidation<T>value >= 0#[koruma(numeric::NonNegativeValidation::<_>)]always
NonPositiveValidation<T>value <= 0#[koruma(numeric::NonPositiveValidation::<_>)]always
NegativeValidation<T>value < 0#[koruma(numeric::NegativeValidation::<_>)]always
RangeValidation<T>Between min and max (inclusive by default) #[koruma(numeric::RangeValidation::<_>(min = 0, max = 100, exclusive_max = true))]always
Validator Rule Example attribute Feature
LenValidation<T>Length within [min, max] #[koruma(collection::LenValidation::<_>(min = 1, max = 10))]always
NonEmptyValidation<T>Collection/string is not empty #[koruma(collection::NonEmptyValidation::<_>)]always
collection::HasLen is implemented for common standard types (String, str,
arrays/slices, Vec, sets/maps, etc.) and optionally for SmallVec with the
smallvec feature.
Validator Rule Example attribute Feature
RequiredValidation<Option<T>>Option must be Some #[koruma(general::RequiredValidation::<Option<_>>)]always
use koruma::{Koruma, KorumaAllDisplay};
use koruma_collection::{collection, general, numeric, string};
#[derive(Koruma, KorumaAllDisplay)]
struct SignupInput {
#[koruma(collection::NonEmptyValidation::<_>)]
username: String,
#[koruma(string::AsciiValidation::<_>, string::AlphanumericValidation::<_>)]
handle: String,
#[koruma(numeric::RangeValidation::<_>(min = 13_u8, max = 120_u8))]
age: u8,
#[koruma(general::RequiredValidation::<Option<_>>)]
display_name: Option<String>,
}
let input = SignupInput {
username: "".to_string(),
handle: "bad-handle".to_string(),
age: 8,
display_name: None,
};
if let Err(errors) = input.validate() {
if let Some(err) = errors.username().non_empty_validation() {
println!("username: {err}");
}
if let Some(err) = errors.handle().ascii_validation() {
println!("handle(ascii): {err}");
}
for err in errors.handle().all() {
println!("handle(any): {err}");
}
}