Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

koruma-collection

A curated set of validators built on top of koruma, organized by domain.

Installation

[dependencies]
koruma-collection = { version = "*", features = ["full"] }

Modules at a glance

use koruma_collection::{collection, format, general, numeric, string};

Feature flags

  • 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

Complete validator catalog

String validators (koruma_collection::string)

ValidatorRuleExample attributeFeature
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

Format validators (koruma_collection::format)

ValidatorRuleExample attributeFeature
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

Numeric validators (koruma_collection::numeric)

ValidatorRuleExample attributeFeature
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

Collection validators (koruma_collection::collection)

ValidatorRuleExample attributeFeature
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.

General validators (koruma_collection::general)

ValidatorRuleExample attributeFeature
RequiredValidation<Option<T>>Option must be Some#[koruma(general::RequiredValidation::<Option<_>>)]always

Example

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}");
    }
}