orbital_base_components/form/
option_bind.rs1use leptos::prelude::*;
2use reactive_stores::Field;
3
4#[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}