Skip to main content

orbital_base_components/form/
option_bind.rs

1use leptos::prelude::*;
2use reactive_stores::Field;
3
4/// Two-way optional value handle for form controls.
5#[derive(Clone)]
6pub enum OptionBind<T: 'static> {
7    Signal(RwSignal<Option<T>>),
8    Field(Field<Option<T>>),
9}
10
11impl<T: Send + Sync + 'static> OptionBind<T> {
12    pub fn get(&self) -> Option<T>
13    where
14        T: Clone,
15    {
16        match self {
17            Self::Signal(signal) => signal.get(),
18            Self::Field(field) => field.get(),
19        }
20    }
21
22    pub fn get_untracked(&self) -> Option<T>
23    where
24        T: Clone,
25    {
26        match self {
27            Self::Signal(signal) => signal.get_untracked(),
28            Self::Field(field) => field.get_untracked(),
29        }
30    }
31
32    pub fn set(&self, value: Option<T>) {
33        match self {
34            Self::Signal(signal) => signal.set(value),
35            Self::Field(field) => field.set(value),
36        }
37    }
38
39    pub fn update(&self, f: impl FnOnce(&mut Option<T>))
40    where
41        T: Clone,
42    {
43        match self {
44            Self::Signal(signal) => signal.update(f),
45            Self::Field(field) => field.update(f),
46        }
47    }
48}
49
50impl<T> From<RwSignal<Option<T>>> for OptionBind<T> {
51    fn from(signal: RwSignal<Option<T>>) -> Self {
52        Self::Signal(signal)
53    }
54}
55
56impl<T> From<Field<Option<T>>> for OptionBind<T> {
57    fn from(field: Field<Option<T>>) -> Self {
58        Self::Field(field)
59    }
60}
61
62impl<T: Send + Sync + 'static> From<Option<T>> for OptionBind<T> {
63    fn from(value: Option<T>) -> Self {
64        Self::Signal(RwSignal::new(value))
65    }
66}
67
68impl<T: Send + Sync + 'static> From<T> for OptionBind<T> {
69    fn from(value: T) -> Self {
70        Self::Signal(RwSignal::new(Some(value)))
71    }
72}
73
74impl<T: Send + Sync + 'static> Default for OptionBind<T> {
75    fn default() -> Self {
76        Self::Signal(RwSignal::new(None))
77    }
78}