impulse_thaw/time_picker/
rule.rs

1use crate::{FieldValidationState, Rule};
2use chrono::NaiveTime;
3use leptos::prelude::*;
4use std::ops::Deref;
5
6#[derive(Debug, Default, PartialEq, Clone, Copy)]
7pub enum TimePickerRuleTrigger {
8    #[default]
9    Blur,
10}
11
12pub struct TimePickerRule(Rule<Option<NaiveTime>, TimePickerRuleTrigger>);
13
14impl TimePickerRule {
15    pub fn required(required: Signal<bool>) -> Self {
16        Self::validator(move |value, name| {
17            if required.get_untracked() && value.is_none() {
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_none() {
32                Err(FieldValidationState::Error(message.get_untracked()))
33            } else {
34                Ok(())
35            }
36        })
37    }
38
39    pub fn validator(
40        f: impl Fn(&Option<NaiveTime>, 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: TimePickerRuleTrigger) -> Self {
49        Self(Rule::with_trigger(self.0, trigger))
50    }
51}
52
53impl Deref for TimePickerRule {
54    type Target = Rule<Option<NaiveTime>, TimePickerRuleTrigger>;
55
56    fn deref(&self) -> &Self::Target {
57        &self.0
58    }
59}