1use serde_json::Map;
2use serde_json::Value;
3
4use crate::Mutability;
5
6pub trait PropertyInstanceGetter {
7 fn get<S: Into<String>>(&self, property_name: S) -> Option<Value>;
9
10 fn as_bool<S: Into<String>>(&self, property_name: S) -> Option<bool>;
12
13 fn as_u64<S: Into<String>>(&self, property_name: S) -> Option<u64>;
15
16 fn as_i64<S: Into<String>>(&self, property_name: S) -> Option<i64>;
18
19 fn as_f64<S: Into<String>>(&self, property_name: S) -> Option<f64>;
21
22 fn as_string<S: Into<String>>(&self, property_name: S) -> Option<String>;
24
25 fn as_array<S: Into<String>>(&self, property_name: S) -> Option<Vec<Value>>;
27
28 fn as_object<S: Into<String>>(&self, property_name: S) -> Option<Map<String, Value>>;
30
31 }
38
39pub trait MutablePropertyInstanceSetter: PropertyInstanceGetter {
40 fn set<S: Into<String>>(&mut self, property_name: S, value: Value);
42
43 }
52
53pub trait PropertyInstanceSetter: PropertyInstanceGetter {
54 fn set_checked<S: Into<String>>(&self, property_name: S, value: Value);
56
57 fn set<S: Into<String>>(&self, property_name: S, value: Value);
59
60 fn set_no_propagate_checked<S: Into<String>>(&self, property_name: S, value: Value);
63
64 fn set_no_propagate<S: Into<String>>(&self, property_name: S, value: Value);
66
67 fn mutability<S: Into<String>>(&self, property_name: S) -> Option<Mutability>;
69
70 fn set_mutability<S: Into<String>>(&self, property_name: S, mutability: Mutability);
72}
73
74#[macro_export]
75macro_rules! rx_accessor {
76 (trigger) => {
78 fn trigger(&self) {
79 $crate::PropertyInstanceSetter::set(self, "trigger", serde_json::json!(true));
80 }
81 };
82 (pub trigger) => {
83 pub fn trigger(&self) {
84 $crate::PropertyInstanceSetter::set(self, "trigger", serde_json::json!(true));
85 }
86 };
87 (get $getter_name: ident value) => {
89 fn $getter_name(&self) -> Option<serde_json::Value> {
90 $crate::PropertyInstanceGetter::get(self, stringify!($getter_name))
91 }
92 };
93 (pub get $getter_name: ident value) => {
94 pub fn $getter_name(&self) -> Option<serde_json::Value> {
95 $crate::PropertyInstanceGetter::get(self, stringify!($getter_name))
96 }
97 };
98 (get $getter_name: ident bool) => {
99 fn $getter_name(&self) -> Option<bool> {
100 $crate::PropertyInstanceGetter::as_bool(self, stringify!($getter_name))
101 }
102 };
103 (pub get $getter_name: ident bool) => {
104 pub fn $getter_name(&self) -> Option<bool> {
105 $crate::PropertyInstanceGetter::as_bool(self, stringify!($getter_name))
106 }
107 };
108 (get $getter_name: ident u64) => {
109 fn $getter_name(&self) -> Option<u64> {
110 $crate::PropertyInstanceGetter::as_u64(self, stringify!($getter_name))
111 }
112 };
113 (pub get $getter_name: ident u64) => {
114 pub fn $getter_name(&self) -> Option<u64> {
115 $crate::PropertyInstanceGetter::as_u64(self, stringify!($getter_name))
116 }
117 };
118 (get $getter_name: ident i64) => {
119 fn $getter_name(&self) -> Option<i64> {
120 $crate::PropertyInstanceGetter::as_i64(self, stringify!($getter_name))
121 }
122 };
123 (pub get $getter_name: ident i64) => {
124 pub fn $getter_name(&self) -> Option<i64> {
125 $crate::PropertyInstanceGetter::as_i64(self, stringify!($getter_name))
126 }
127 };
128 (get $getter_name: ident f64) => {
129 fn $getter_name(&self) -> Option<f64> {
130 $crate::PropertyInstanceGetter::as_f64(self, stringify!($getter_name))
131 }
132 };
133 (pub get $getter_name: ident f64) => {
134 pub fn $getter_name(&self) -> Option<f64> {
135 $crate::PropertyInstanceGetter::as_f64(self, stringify!($getter_name))
136 }
137 };
138 (get $getter_name: ident string) => {
139 fn $getter_name(&self) -> Option<String> {
140 $crate::PropertyInstanceGetter::as_string(self, stringify!($getter_name)).map(String::from)
141 }
142 };
143 (pub get $getter_name: ident string) => {
144 pub fn $getter_name(&self) -> Option<String> {
145 $crate::PropertyInstanceGetter::as_string(self, stringify!($getter_name)).map(String::from)
146 }
147 };
148 (get $getter_name: ident array) => {
149 fn $getter_name(&self) -> Option<Vec<serde_json::Value>> {
150 $crate::PropertyInstanceGetter::as_array(self, stringify!($getter_name))
151 }
152 };
153 (pub get $getter_name: ident array) => {
154 pub fn $getter_name(&self) -> Option<Vec<serde_json::Value>> {
155 $crate::PropertyInstanceGetter::as_array(self, stringify!($getter_name))
156 }
157 };
158 (get $getter_name: ident object) => {
159 fn $getter_name(&self) -> Option<serde_json::Map<String, serde_json::Value>> {
160 $crate::PropertyInstanceGetter::as_object(self, stringify!($getter_name))
161 }
162 };
163 (pub get $getter_name: ident object) => {
164 pub fn $getter_name(&self) -> Option<serde_json::Map<String, serde_json::Value>> {
165 $crate::PropertyInstanceGetter::as_object(self, stringify!($getter_name))
166 }
167 };
168 (set $setter_name: ident value) => {
170 fn $setter_name(&self, v: serde_json::Value) {
171 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), v);
172 }
173 };
174 (pub set $setter_name: ident value) => {
175 pub fn $setter_name(&self, v: serde_json::Value) {
176 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), v);
177 }
178 };
179 (set $setter_name: ident bool) => {
180 fn $setter_name(&self, v: bool) {
181 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
182 }
183 };
184 (pub set $setter_name: ident bool) => {
185 pub fn $setter_name(&self, v: bool) {
186 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
187 }
188 };
189 (set $setter_name: ident u64) => {
190 fn $setter_name(&self, v: u64) {
191 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
192 }
193 };
194 (pub set $setter_name: ident u64) => {
195 pub fn $setter_name(&self, v: u64) {
196 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
197 }
198 };
199 (set $setter_name: ident i64) => {
200 fn $setter_name(&self, v: i64) {
201 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
202 }
203 };
204 (pub set $setter_name: ident i64) => {
205 pub fn $setter_name(&self, v: i64) {
206 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
207 }
208 };
209 (set $setter_name: ident f64) => {
210 fn $setter_name(&self, v: f64) {
211 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
212 }
213 };
214 (pub set $setter_name: ident f64) => {
215 pub fn $setter_name(&self, v: f64) {
216 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
217 }
218 };
219 (set $setter_name: ident string) => {
220 fn $setter_name<S: Into<String>>(&self, v: S) {
221 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v.into()));
222 }
223 };
224 (pub set $setter_name: ident string) => {
225 pub fn $setter_name<S: Into<String>>(&self, v: S) {
226 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v.into()));
227 }
228 };
229 (set $setter_name: ident array) => {
230 fn $setter_name(&self, v: Vec<serde_json::Value>) {
231 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
232 }
233 };
234 (pub set $setter_name: ident array) => {
235 pub fn $setter_name(&self, v: Vec<serde_json::Value>) {
236 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
237 }
238 };
239 (set $setter_name: ident object) => {
240 fn $setter_name(&self, v: serde_json::Map<String, serde_json::Value>) {
241 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
242 }
243 };
244 (pub set $setter_name: ident object) => {
245 pub fn $setter_name(&self, v: serde_json::Map<String, serde_json::Value>) {
246 $crate::PropertyInstanceSetter::set(self, stringify!($setter_name), serde_json::json!(v));
247 }
248 };
249 (data $property_name: ident value) => {
251 paste::paste! {
252 fn [<get_ $property_name>](&self) -> Option<serde_json::Value> {
253 $crate::PropertyInstanceGetter::get(self, stringify!($property_name))
254 }
255 fn [<set_ $property_name>](&self, v: serde_json::Value) {
256 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), v);
257 }
258 }
259 };
260 (pub data $property_name: ident value) => {
261 paste::paste! {
262 pub fn [<get_ $property_name>](&self) -> Option<serde_json::Value> {
263 $crate::PropertyInstanceGetter::get(self, stringify!($property_name))
264 }
265 pub fn [<set_ $property_name>](&self, v: serde_json::Value) {
266 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), v);
267 }
268 }
269 };
270 (data $property_name: ident bool) => {
271 paste::paste! {
272 fn [<get_ $property_name>](&self) -> Option<bool> {
273 $crate::PropertyInstanceGetter::as_bool(self, stringify!($property_name))
274 }
275 fn [<set_ $property_name>](&self, v: bool) {
276 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
277 }
278 }
279 };
280 (pub data $property_name: ident bool) => {
281 paste::paste! {
282 pub fn [<get_ $property_name>](&self) -> Option<bool> {
283 $crate::PropertyInstanceGetter::as_bool(self, stringify!($property_name))
284 }
285 pub fn [<set_ $property_name>](&self, v: bool) {
286 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
287 }
288 }
289 };
290 (data $property_name: ident u64) => {
291 paste::paste! {
292 fn [<get_ $property_name>](&self) -> Option<u64> {
293 $crate::PropertyInstanceGetter::as_u64(self, stringify!($property_name))
294 }
295 fn [<set_ $property_name>](&self, v: u64) {
296 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
297 }
298 }
299 };
300 (pub data $property_name: ident u64) => {
301 paste::paste! {
302 pub fn [<get_ $property_name>](&self) -> Option<u64> {
303 $crate::PropertyInstanceGetter::as_u64(self, stringify!($property_name))
304 }
305 pub fn [<set_ $property_name>](&self, v: u64) {
306 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
307 }
308 }
309 };
310 (data $property_name: ident i64) => {
311 paste::paste! {
312 fn [<get_ $property_name>](&self) -> Option<i64> {
313 $crate::PropertyInstanceGetter::as_i64(self, stringify!($property_name))
314 }
315 fn [<set_ $property_name>](&self, v: i64) {
316 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
317 }
318 }
319 };
320 (pub data $property_name: ident i64) => {
321 paste::paste! {
322 pub fn [<get_ $property_name>](&self) -> Option<i64> {
323 $crate::PropertyInstanceGetter::as_i64(self, stringify!($property_name))
324 }
325 pub fn [<set_ $property_name>](&self, v: i64) {
326 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
327 }
328 }
329 };
330 (data $property_name: ident f64) => {
331 paste::paste! {
332 fn [<get_ $property_name>](&self) -> Option<f64> {
333 $crate::PropertyInstanceGetter::as_f64(self, stringify!($property_name))
334 }
335 fn [<set_ $property_name>](&self, v: f64) {
336 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
337 }
338 }
339 };
340 (pub data $property_name: ident f64) => {
341 paste::paste! {
342 pub fn [<get_ $property_name>](&self) -> Option<f64> {
343 $crate::PropertyInstanceGetter::as_f64(self, stringify!($property_name))
344 }
345 pub fn [<set_ $property_name>](&self, v: f64) {
346 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
347 }
348 }
349 };
350 (data $property_name: ident string) => {
351 paste::paste! {
352 fn [<get_ $property_name>](&self) -> Option<String> {
353 $crate::PropertyInstanceGetter::as_string(self, stringify!($property_name)).map(String::from)
354 }
355 fn [<set_ $property_name>]<S: Into<String>>(&self, v: S) {
356 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v.into()));
357 }
358 }
359 };
360 (pub data $property_name: ident string) => {
361 paste::paste! {
362 pub fn [<get_ $property_name>](&self) -> Option<String> {
363 $crate::PropertyInstanceGetter::as_string(self, stringify!($property_name)).map(String::from)
364 }
365 pub fn [<set_ $property_name>]<S: Into<String>>(&self, v: S) {
366 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v.into()));
367 }
368 }
369 };
370 (data $property_name: ident array) => {
371 paste::paste! {
372 fn [<get_ $property_name>](&self) -> Option<Vec<serde_json::Value>> {
373 $crate::PropertyInstanceGetter::as_array(self, stringify!($property_name))
374 }
375 fn [<set_ $property_name>](&self, v: Vec<serde_json::Value>) {
376 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
377 }
378 }
379 };
380 (pub data $property_name: ident array) => {
381 paste::paste! {
382 pub fn [<get_ $property_name>](&self) -> Option<Vec<serde_json::Value>> {
383 $crate::PropertyInstanceGetter::as_array(self, stringify!($property_name))
384 }
385 pub fn [<set_ $property_name>](&self, v: Vec<serde_json::Value>) {
386 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
387 }
388 }
389 };
390 (data $property_name: ident object) => {
391 paste::paste! {
392 fn [<get_ $property_name>](&self) -> Option<serde_json::Map<String, serde_json::Value>> {
393 $crate::PropertyInstanceGetter::as_object(self, stringify!($property_name))
394 }
395 fn [<set_ $property_name>](&self, v: serde_json::Map<String, serde_json::Value>) {
396 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
397 }
398 }
399 };
400 (pub data $property_name: ident object) => {
401 paste::paste! {
402 pub fn [<get_ $property_name>](&self) -> Option<serde_json::Map<String, serde_json::Value>> {
403 $crate::PropertyInstanceGetter::as_object(self, stringify!($property_name))
404 }
405 pub fn [<set_ $property_name>](&self, v: serde_json::Map<String, serde_json::Value>) {
406 $crate::PropertyInstanceSetter::set(self, stringify!($property_name), serde_json::json!(v));
407 }
408 }
409 };
410}