impulse_thaw/select/
rule.rs1use 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}