source2_demo/
macros.rs

1#[macro_export]
2macro_rules! try_observers {
3    ($self:ident, $flag:ident, $method:ident ( $($arg:expr),* )) => {{
4        use $crate::Interests;
5        if !$self.global_mask.intersects(Interests::$flag) {
6            Ok(())
7        } else {
8            ($self.observers.iter().zip($self.observer_masks.iter()))
9                .try_for_each(|(obs, &mask)| {
10                    if mask.intersects(Interests::$flag) {
11                        obs.borrow_mut().$method($($arg),*)
12                    } else {
13                        Ok(())
14                    }
15                })
16        }
17    }};
18}
19/// Macro for getting property from [`crate::Entity`].
20///
21/// # Examples
22/// ```no_compile
23/// let x: i32 = property!(entity, "property_name");
24/// let y = property!(entity, i32, "property_name");
25/// ```
26#[macro_export]
27macro_rules! property {
28    ($ent:expr, $ty:ty, $fmt:literal, $($arg:tt)*) => {
29        {
30            let x: $ty = $ent.get_property_by_name(&format!($fmt, $($arg)*))?.try_into()?;
31            x
32        }
33    };
34    ($ent:expr, $ty:ty, $fmt:literal) => {
35        {
36            let x: $ty = $ent.get_property_by_name(&format!($fmt))?.try_into()?;
37            x
38        }
39    };
40    ($ent:expr, $fmt:expr, $($arg:tt)*) => {
41        $ent.get_property_by_name(&format!($fmt, $($arg)*))?.try_into()?
42    };
43    ($ent:expr, $fmt:expr) => {{
44        $ent.get_property_by_name(&format!($fmt))?.try_into()?
45    }};
46}
47
48/// Same as [`crate::property`] but returns `None` if property doesn't exist for given
49/// [`crate::Entity`] or cannot be converted into given type.
50///
51/// # Examples
52/// ```no_compile
53/// let x: i32 = try_property!(entity, "property_name").unwrap_or_default();
54/// let y = try_property!(entity, i32, "property_name").unwrap_or_default();
55/// ```
56#[macro_export]
57macro_rules! try_property {
58    ($ent:expr, $ty:ty, $fmt:expr, $($arg:tt)*) => {
59        {
60            let x: Option<$ty> = $ent
61                .get_property_by_name(&format!($fmt, $($arg)*))
62                .ok()
63                .and_then(|x| {
64                    x.try_into().ok()
65                });
66            x
67        }
68    };
69
70    ($ent:expr, $ty:ty, $fmt:expr) => {
71        {
72            let x: Option<$ty> = $ent
73                .get_property_by_name(&format!($fmt))
74                .ok()
75                .and_then(|x| {
76                    x.try_into().ok()
77                });
78            x
79        }
80    };
81
82    ($ent:expr, $fmt:expr, $($arg:tt)*) => {
83        $ent
84            .get_property_by_name(&format!($fmt, $($arg)*))
85            .ok()
86            .and_then(|x| {
87                x.try_into().ok()
88            })
89    };
90
91    ($ent:expr, $fmt:expr) => {{
92        $ent
93            .get_property_by_name(&format!($fmt))
94            .ok()
95            .and_then(|x| {
96                x.try_into().ok()
97            })
98    }};
99}