leptos_controls_core/
rw_signal.rs1use 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}