impulse_thaw/combobox/combobox/
rule.rs

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