summaryrefslogtreecommitdiffstats
path: root/toolkit/components/glean/api/src/ffi/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/glean/api/src/ffi/macros.rs')
-rw-r--r--toolkit/components/glean/api/src/ffi/macros.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/toolkit/components/glean/api/src/ffi/macros.rs b/toolkit/components/glean/api/src/ffi/macros.rs
new file mode 100644
index 0000000000..c6776e96af
--- /dev/null
+++ b/toolkit/components/glean/api/src/ffi/macros.rs
@@ -0,0 +1,61 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+//! Helper macros for implementing the FFI API for metric types.
+
+/// Get a metric object by ID from the corresponding map.
+///
+/// # Arguments
+///
+/// * `$map` - The name of the hash map within `metrics::__glean_metric_maps`
+/// as generated by glean_parser.
+/// * `$id` - The ID of the metric to get.
+macro_rules! metric_get {
+ ($map:ident, $id:ident) => {
+ match $crate::metrics::__glean_metric_maps::$map.get(&$id.into()) {
+ Some(metric) => metric,
+ None => panic!("No metric for id {}", $id),
+ }
+ };
+}
+
+/// Test whether a value is stored for the metric identified by its ID.
+///
+/// # Arguments
+///
+/// * `$map` - The name of the hash map within `metrics::__glean_metric_maps`
+/// as generated by glean_parser.
+/// * `$id` - The ID of the metric to get.
+/// * `$storage` - the storage name to look into.
+macro_rules! test_has {
+ ($map:ident, $id:ident, $storage:ident) => {{
+ let metric = metric_get!($map, $id);
+ let storage = if $storage.is_empty() {
+ None
+ } else {
+ Some($storage.to_utf8())
+ };
+ metric.test_get_value(storage.as_deref()).is_some()
+ }};
+}
+
+/// Get the currently stored value for the metric identified by its ID.
+///
+/// # Arguments
+///
+/// * `$map` - The name of the hash map within `metrics::__glean_metric_maps`
+/// as generated by glean_parser.
+/// * `$id` - The ID of the metric to get.
+/// * `$storage` - the storage name to look into.
+macro_rules! test_get {
+ ($map:ident, $id:ident, $storage:ident) => {{
+ let metric = metric_get!($map, $id);
+ let storage = if $storage.is_empty() {
+ None
+ } else {
+ Some($storage.to_utf8())
+ };
+ metric.test_get_value(storage.as_deref()).unwrap()
+ }};
+}