Declaration des champs
Deux façons de declarer un champ — manuellement via register_fields, ou via la macro proc #[form].
Declaration manuelle — register_fields
formulaire
use runique::prelude::*;
#[derive(Serialize, Debug, Clone)]
#[serde(transparent)]
pub struct MonForm {
pub form: Forms,
}
impl RuniqueForm for MonForm {
fn register_fields(form: &mut Forms) {
form.field(&TextField::text("username")
.label("Nom d'utilisateur"));
form.field(&TextField::email("email")
.label("Adresse email"));
form.field(&TextField::password("password")
.label("Mot de passe")
.min_length(8, "8 caracteres minimum"));
form.field(&NumericField::integer("age")
.label("Age")
.min(0.0, "Valeur positive"));
form.field(&BooleanField::new("actif")
.label("Compte actif"));
let roles = vec![
ChoiceOption::new("admin", "Administrateur"),
ChoiceOption::new("user", "Utilisateur"),
];
form.field(&ChoiceField::new("role")
.label("Role")
.choices(roles));
}
}
Declaration manuelle — register_fields
formulaire
use runique::prelude::*;
#[derive(Serialize, Debug, Clone)]
#[serde(transparent)]
pub struct MonForm {
pub form: Forms,
}
impl RuniqueForm for MonForm {
fn register_fields(form: &mut Forms) {
form.field(&TextField::text("username")
.label("Nom d'utilisateur"));
form.field(&TextField::email("email")
.label("Adresse email"));
form.field(&TextField::password("password")
.label("Mot de passe")
.min_length(8, "8 caracteres minimum"));
form.field(&NumericField::integer("age")
.label("Age")
.min(0.0, "Valeur positive"));
form.field(&BooleanField::new("actif")
.label("Compte actif"));
let roles = vec![
ChoiceOption::new("admin", "Administrateur"),
ChoiceOption::new("user", "Utilisateur"),
];
form.field(&ChoiceField::new("role")
.label("Role")
.choices(roles));
}
}
Macro proc #[form] — base sur un schema DB
formulaire
use crate::entities::contribution::schema as contribution;
use runique::prelude::*;
// Les champs sont lus depuis le schema SeaORM
// — types, contraintes, nullable deduits automatiquement
#[form(schema = contribution, fields = [title, content])]
pub struct ContributionForm;
#[async_trait]
impl RuniqueForm for ContributionForm {
impl_form_access!(model);
async fn clean(&mut self) -> Result<(), StrMap> {
let title = self.get_string("title");
let mut errors = StrMap::new();
if title.len() < 5 {
errors.insert(
"title".to_string(),
"5 caracteres minimum".to_string(),
);
}
if errors.is_empty() { Ok(()) }
else { Err(errors) }
}
}
Macro proc #[form] — base sur un schema DB
formulaire
use crate::entities::contribution::schema as contribution;
use runique::prelude::*;
// Les champs sont lus depuis le schema SeaORM
// — types, contraintes, nullable deduits automatiquement
#[form(schema = contribution, fields = [title, content])]
pub struct ContributionForm;
#[async_trait]
impl RuniqueForm for ContributionForm {
impl_form_access!(model);
async fn clean(&mut self) -> Result<(), StrMap> {
let title = self.get_string("title");
let mut errors = StrMap::new();
if title.len() < 5 {
errors.insert(
"title".to_string(),
"5 caracteres minimum".to_string(),
);
}
if errors.is_empty() { Ok(()) }
else { Err(errors) }
}
}
Difference cle
// Manuel — controle total, sans entite DB
// -> ideal pour formulaires de contact, login, recherche
// #[form] — branche sur le schema SeaORM
// -> ideal pour CRUD, ModelForm Django-like
// -> form.save(&db).await? disponible automatiquement
Difference cle
// Manuel — controle total, sans entite DB
// -> ideal pour formulaires de contact, login, recherche
// #[form] — branche sur le schema SeaORM
// -> ideal pour CRUD, ModelForm Django-like
// -> form.save(&db).await? disponible automatiquement