impulse_thaw/select/
rule.rs

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