leptos_controls_core/
rw_signal.rs

1use crate::field::Field;
2use crate::FieldMeta;
3use leptos::*;
4use std::borrow::Cow;
5use std::marker::PhantomData;
6
7pub struct RwSignalField<M, T>
8where
9    T: Clone + Default + 'static,
10    M: FieldMeta<Type = T>,
11{
12    pub(crate) value: RwSignal<T>,
13    _mark: PhantomData<M>,
14}
15
16impl<M, T> RwSignalField<M, T>
17where
18    T: Clone + Default + 'static,
19    M: FieldMeta<Type = T>,
20{
21    pub fn new(value: T) -> Self {
22        Self {
23            value: create_rw_signal(value),
24            _mark: PhantomData,
25        }
26    }
27}
28
29impl<M, T> Field for RwSignalField<M, T>
30where
31    T: Clone + Default + 'static,
32    M: FieldMeta<Type = T>,
33{
34    fn label(&self) -> &'static str {
35        M::LABEL
36    }
37
38    fn required(&self) -> bool {
39        M::REQUIRED
40    }
41
42    fn validate(&self) -> Option<Cow<'static, str>> {
43        M::VALIDATE(&self.get_untracked())
44    }
45
46    fn set_default(&self) {
47        self.value.set(Default::default());
48    }
49}
50
51impl<M, T> Default for RwSignalField<M, T>
52where
53    T: Clone + Default + 'static,
54    M: FieldMeta<Type = T>,
55{
56    fn default() -> Self {
57        Self::new(T::default())
58    }
59}
60
61impl<M, T> SignalWithUntracked for RwSignalField<M, T>
62where
63    T: Clone + Default + 'static,
64    M: FieldMeta<Type = T>,
65{
66    type Value = T;
67
68    fn with_untracked<O>(&self, f: impl FnOnce(&Self::Value) -> O) -> O {
69        self.value.with_untracked(f)
70    }
71
72    fn try_with_untracked<O>(&self, f: impl FnOnce(&Self::Value) -> O) -> Option<O> {
73        self.value.try_with_untracked(f)
74    }
75}
76impl<M, T> SignalWith for RwSignalField<M, T>
77where
78    T: Clone + Default + 'static,
79    M: FieldMeta<Type = T>,
80{
81    type Value = T;
82
83    fn with<O>(&self, f: impl FnOnce(&Self::Value) -> O) -> O {
84        self.value.with(f)
85    }
86
87    fn try_with<O>(&self, f: impl FnOnce(&Self::Value) -> O) -> Option<O> {
88        self.value.try_with(f)
89    }
90}
91impl<M, T> SignalUpdateUntracked<T> for RwSignalField<M, T>
92where
93    T: Clone + Default + 'static,
94    M: FieldMeta<Type = T>,
95{
96    fn update_untracked(&self, f: impl FnOnce(&mut T)) {
97        self.value.update_untracked(f)
98    }
99
100    fn try_update_untracked<O>(&self, f: impl FnOnce(&mut T) -> O) -> Option<O> {
101        self.value.try_update_untracked(f)
102    }
103}
104impl<M, T> SignalUpdate for RwSignalField<M, T>
105where
106    T: Clone + Default + 'static,
107    M: FieldMeta<Type = T>,
108{
109    type Value = T;
110
111    fn update(&self, f: impl FnOnce(&mut Self::Value)) {
112        self.value.update(f);
113    }
114
115    fn try_update<O>(&self, f: impl FnOnce(&mut Self::Value) -> O) -> Option<O> {
116        self.value.try_update(f)
117    }
118}
119impl<M, T> SignalSetUntracked<T> for RwSignalField<M, T>
120where
121    T: Clone + Default + 'static,
122    M: FieldMeta<Type = T>,
123{
124    fn set_untracked(&self, new_value: T) {
125        self.value.set_untracked(new_value);
126    }
127
128    fn try_set_untracked(&self, new_value: T) -> Option<T> {
129        self.value.try_set_untracked(new_value)
130    }
131}
132impl<M, T> SignalSet for RwSignalField<M, T>
133where
134    T: Clone + Default + 'static,
135    M: FieldMeta<Type = T>,
136{
137    type Value = T;
138
139    fn set(&self, new_value: Self::Value) {
140        self.value.set(new_value);
141    }
142
143    fn try_set(&self, new_value: Self::Value) -> Option<Self::Value> {
144        self.value.try_set(new_value)
145    }
146}
147impl<M, T> SignalGetUntracked for RwSignalField<M, T>
148where
149    T: Clone + Default + 'static,
150    M: FieldMeta<Type = T>,
151{
152    type Value = T;
153
154    fn get_untracked(&self) -> Self::Value {
155        self.value.get_untracked()
156    }
157
158    fn try_get_untracked(&self) -> Option<Self::Value> {
159        self.value.try_get_untracked()
160    }
161}
162impl<M, T> SignalGet for RwSignalField<M, T>
163where
164    T: Clone + Default + 'static,
165    M: FieldMeta<Type = T>,
166{
167    type Value = T;
168
169    fn get(&self) -> Self::Value {
170        self.value.get()
171    }
172
173    fn try_get(&self) -> Option<Self::Value> {
174        self.value.try_get()
175    }
176}
177impl<M, T> Clone for RwSignalField<M, T>
178where
179    T: Clone + Default + 'static,
180    M: FieldMeta<Type = T>,
181{
182    fn clone(&self) -> Self {
183        *self
184    }
185}
186impl<M, T> Copy for RwSignalField<M, T>
187where
188    T: Clone + Default + 'static,
189    M: FieldMeta<Type = T>,
190{
191}