Skip to main content

statsig_rust/
macros.rs

1pub(crate) const LOCK_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(5);
2
3#[macro_export]
4macro_rules! unwrap_or_return {
5    ($res: expr, $code: expr) => {
6        match $res {
7            Some(v) => v,
8            None => return $code,
9        }
10    };
11}
12
13#[macro_export]
14macro_rules! unwrap_or_return_with {
15    ($res: expr, $func:expr) => {
16        match $res {
17            Some(v) => v,
18            None => return $func(),
19        }
20    };
21}
22
23#[macro_export]
24macro_rules! unwrap_or_else {
25    ($res: expr, $else_block:block) => {
26        match $res {
27            Some(v) => v,
28            None => $else_block,
29        }
30    };
31}
32
33#[macro_export]
34macro_rules! ok_or_return_with {
35    ($res:expr, $func:expr) => {
36        match $res {
37            Ok(v) => v,
38            Err(e) => return $func(e),
39        }
40    };
41}
42
43#[macro_export]
44macro_rules! unwrap_or_noop {
45    ($res: expr) => {
46        match $res {
47            Some(v) => v,
48            None => return,
49        }
50    };
51}
52
53#[macro_export]
54macro_rules! read_lock_or_else {
55    ($lock:expr, $else_block:block) => {
56        match $lock.try_read_for($crate::macros::LOCK_TIMEOUT) {
57            Some(data) => data,
58            None => {
59                if cfg!(test) {
60                    panic!("Failed to acquire read lock");
61                } else {
62                    $else_block
63                }
64            }
65        }
66    };
67}
68
69#[macro_export]
70macro_rules! read_lock_or_return {
71    ($tag: expr, $lock:expr, $code: expr) => {
72        match $lock.try_read_for($crate::macros::LOCK_TIMEOUT) {
73            Some(data) => data,
74            None => {
75                if cfg!(test) {
76                    panic!("Failed to acquire read lock");
77                } else {
78                    $crate::log_e!($tag, "Failed to acquire read lock");
79                    return $code;
80                }
81            }
82        }
83    };
84}
85
86#[macro_export]
87macro_rules! write_lock_or_else {
88    ($lock:expr, $else_block:block) => {
89        match $lock.try_write_for($crate::macros::LOCK_TIMEOUT) {
90            Some(data) => data,
91            None => {
92                if cfg!(test) {
93                    panic!("Failed to acquire write lock");
94                } else {
95                    $else_block
96                }
97            }
98        }
99    };
100}
101
102#[macro_export]
103macro_rules! write_lock_or_noop {
104    ($tag: expr, $lock:expr) => {
105        match $lock.try_write_for($crate::macros::LOCK_TIMEOUT) {
106            Some(data) => data,
107            None => {
108                if cfg!(test) {
109                    panic!("Failed to acquire write lock");
110                } else {
111                    $crate::log_e!($tag, "Failed to acquire write lock");
112                    return;
113                }
114            }
115        }
116    };
117}
118
119#[macro_export]
120macro_rules! write_lock_or_return {
121    ($tag: expr, $lock:expr, $code: expr) => {
122        match $lock.try_write_for($crate::macros::LOCK_TIMEOUT) {
123            Some(data) => data,
124            None => {
125                if cfg!(test) {
126                    panic!("Failed to acquire write lock");
127                } else {
128                    $crate::log_e!($tag, "Failed to acquire write lock");
129                    return $code;
130                }
131            }
132        }
133    };
134}
135
136#[macro_export]
137macro_rules! serialize_if_not_none {
138    ($state: expr, $field_name: expr, $value: expr) => {
139        if let Some(v) = $value {
140            $state.serialize_field($field_name, v)?
141        }
142    };
143}