Logo

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