Skip to main content

orbital_base_components/form/rules/
radio_group.rs

1use std::ops::Deref;
2
3use leptos::prelude::*;
4
5use super::{FieldValidationState, Rule};
6
7#[derive(Debug, Default, PartialEq, Clone, Copy)]
8pub enum RadioGroupRuleTrigger {
9    #[default]
10    Change,
11}
12
13pub struct RadioGroupRule(Rule<Option<String>, RadioGroupRuleTrigger>);
14
15impl RadioGroupRule {
16    pub fn required(required: Signal<bool>) -> Self {
17        Self::validator(move |value, name| {
18            if required.get_untracked() && value.is_none() {
19                let message = name.get_untracked().map_or_else(
20                    || String::from("Please select!"),
21                    |name| format!("Please select {name}!"),
22                );
23                Err(FieldValidationState::Error(message))
24            } else {
25                Ok(())
26            }
27        })
28    }
29
30    pub fn required_with_message(required: Signal<bool>, message: Signal<String>) -> Self {
31        Self::validator(move |value, _| {
32            if required.get_untracked() && value.is_none() {
33                Err(FieldValidationState::Error(message.get_untracked()))
34            } else {
35                Ok(())
36            }
37        })
38    }
39
40    pub fn validator(
41        f: impl Fn(&Option<String>, Signal<Option<String>>) -> Result<(), FieldValidationState>
42            + Send
43            + Sync
44            + 'static,
45    ) -> Self {
46        Self(Rule::validator(f))
47    }
48
49    pub fn with_trigger(self, trigger: RadioGroupRuleTrigger) -> Self {
50        Self(Rule::with_trigger(self.0, trigger))
51    }
52}
53
54impl Deref for RadioGroupRule {
55    type Target = Rule<Option<String>, RadioGroupRuleTrigger>;
56
57    fn deref(&self) -> &Self::Target {
58        &self.0
59    }
60}