impulse_thaw/date_picker/
rule.rs1use crate::{FieldValidationState, Rule};
2use chrono::NaiveDate;
3use leptos::prelude::*;
4use std::ops::Deref;
5
6#[derive(Debug, Default, PartialEq, Clone, Copy)]
7pub enum DatePickerRuleTrigger {
8 #[default]
9 Blur,
10}
11
12pub struct DatePickerRule(Rule<Option<NaiveDate>, DatePickerRuleTrigger>);
13
14impl DatePickerRule {
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<NaiveDate>, 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: DatePickerRuleTrigger) -> Self {
49 Self(Rule::with_trigger(self.0, trigger))
50 }
51}
52
53impl Deref for DatePickerRule {
54 type Target = Rule<Option<NaiveDate>, DatePickerRuleTrigger>;
55
56 fn deref(&self) -> &Self::Target {
57 &self.0
58 }
59}