Aller au contenu principal
Version: v0.6.0

Validateurs

Un validateur évalue (et peut transformer) la valeur d'un champ. Les champs lax, requis et virtuels peuvent chacun en avoir jusqu'à deux : un #[validate] primaire et un #[re_validate] secondaire, qui ne s'exécute qu'une fois le validateur primaire déjà réussi.

Les deux partagent la même signature : |value, ctx, opts| -> Result<Option<T>, (String, Option<Metadata>)>.

  • Ok(None) accepte la valeur telle quelle.
  • Ok(Some(nouvelle_valeur)) la remplace.
  • Err((raison, metadata)) la rejette -- metadata vaut None sauf si vous utilisez un IvoErrorSanitizer personnalisé.
use ivo::ivo_schema;

#[ivo_schema(input(DataInput, derive(Debug, Clone, PartialEq)))]
mod re_validate_schema {
struct Fields {
#[required]
#[validate(|v: String, _, _| Ok(Some(v)))]
#[re_validate(|v: String, _, _| Ok(Some(format!("revalidated-{v}"))))]
pub username: String,
}
}

fn main() {
let (created, _ctx_options) = re_validate_schema::DataInputModel
.create(
re_validate_schema::PartialDataInput {
username: Some("jane".into()),
},
(),
)
.unwrap();

println!("{:?}", created); // DataInput { username: "revalidated-jane" }
}

#[re_validate] nécessite la présence de #[validate] sur le même champ -- c'est une erreur de compilation sinon. Voir un exemple réel (vérifier qu'un nom d'utilisateur n'est pas déjà pris, via ctx_options) dans examples/main_demo.

Validateurs intégrés​

Activez la fonctionnalité optionnelle validators (ivo = { version = "*", features = ["validators"] }, crate ivo-validators) pour un petit ensemble de validateurs intégrés :

  • validate_email(value: &str) -> Result<String, String>
  • validate_credit_card(value: &str) -> Result<String, String>
#[lax(None)]
#[validate(|v: Option<String>, _, _| {
let Some(email) = v else { return Ok(None) };
match validate_email(&email) {
Ok(validated) => Ok(Some(Some(validated))),
Err(e) => Err((e, None)),
}
})]
pub email: Option<String>,

Voir le code source du crate pour les détails d'implémentation, et main_demo pour un schéma qui les utilise.