reactive_graph_graph/instances/properties/
property_instance_accessor.rs

1use serde_json::Map;
2use serde_json::Value;
3
4use crate::Mutability;
5
6pub trait PropertyInstanceGetter {
7    /// Returns the json value of the given property by name
8    fn get<S: Into<String>>(&self, property_name: S) -> Option<Value>;
9
10    /// Returns the boolean value of the given property by name
11    fn as_bool<S: Into<String>>(&self, property_name: S) -> Option<bool>;
12
13    /// Returns the u64 value of the given property by name
14    fn as_u64<S: Into<String>>(&self, property_name: S) -> Option<u64>;
15
16    /// Returns the i64 value of the given property by name
17    fn as_i64<S: Into<String>>(&self, property_name: S) -> Option<i64>;
18
19    /// Returns the f64 value of the given property by name
20    fn as_f64<S: Into<String>>(&self, property_name: S) -> Option<f64>;
21
22    /// Returns the string value of the given property by name
23    fn as_string<S: Into<String>>(&self, property_name: S) -> Option<String>;
24
25    /// Returns the string value of the given property by name
26    fn as_array<S: Into<String>>(&self, property_name: S) -> Option<Vec<Value>>;
27
28    /// Returns the string value of the given property by name
29    fn as_object<S: Into<String>>(&self, property_name: S) -> Option<Map<String, Value>>;
30
31    // TODO: integrate with other non-primitive types
32    // as_byte_array (string BASE64 -> Vec<u8>)
33    // as_date (string ISO8601 -> chrono::Date)
34    // as_date_time (string ISO8601 -> chrono::DateTime)
35    // as_time (string ISO8601 -> chrono::naive::NaiveTime)
36    // as_uuid (string uuid -> Uuid)
37}
38
39pub trait MutablePropertyInstanceSetter: PropertyInstanceGetter {
40    /// Sets the value of the given property by name
41    fn set<S: Into<String>>(&mut self, property_name: S, value: Value);
42
43    // TODO: Typed setters
44    // set_bool(property_name, value)
45    // set_number(property_name, value)
46    // set_byte_array(property_name, u8[] -> string BASE64)
47    // set_date(property_name, chrono::Date -> string ISO8601)
48    // set_date_time(property_name, chrono::Date -> string ISO8601)
49    // as_time(property_name, chrono::naive::NaiveTime -> string ISO8601)
50    // as_uuid(property_name, Uuid -> string uuid)
51}
52
53pub trait PropertyInstanceSetter: PropertyInstanceGetter {
54    /// Sets the value of the given property by name if the property is mutable.
55    fn set_checked<S: Into<String>>(&self, property_name: S, value: Value);
56
57    /// Sets the value of the given property by name
58    fn set<S: Into<String>>(&self, property_name: S, value: Value);
59
60    /// Sets the value of the given property by name if the property is mutable. Sends the value
61    /// down the stream.
62    fn set_no_propagate_checked<S: Into<String>>(&self, property_name: S, value: Value);
63
64    /// Sets the value of the given property by name. Sends the value down the stream.
65    fn set_no_propagate<S: Into<String>>(&self, property_name: S, value: Value);
66
67    /// Returns the mutability of the property by name.
68    fn mutability<S: Into<String>>(&self, property_name: S) -> Option<Mutability>;
69
70    /// Sets the mutability of the property by name.
71    fn set_mutability<S: Into<String>>(&self, property_name: S, mutability: Mutability);
72}
73
74#[macro_export]
75macro_rules! rx_accessor {
76    // Special accessors
77    (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    // Getters
88    (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    // Setters
169    (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 (getter + setter)
250    (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}