use std::os::raw::c_char;
use ffi_support::FfiStr;
use crate::{define_metric, handlemap_ext::HandleMapExtension, with_glean_value};
define_metric!(DatetimeMetric => DATETIME_METRICS {
new -> glean_new_datetime_metric(time_unit: i32),
test_get_num_recorded_errors -> glean_datetime_test_get_num_recorded_errors,
destroy -> glean_destroy_datetime_metric,
});
#[no_mangle]
pub extern "C" fn glean_datetime_set(
metric_id: u64,
year: i32,
month: u32,
day: u32,
hour: u32,
minute: u32,
second: u32,
nano: i64,
offset_seconds: i32,
) {
if nano < 0 || nano > i64::from(std::u32::MAX) {
log::error!("Unexpected `nano` value coming from platform code {}", nano);
return;
}
let converted_nanos = nano as u32;
with_glean_value(|glean| {
DATETIME_METRICS.call_infallible(metric_id, |metric| {
metric.set_with_details(
glean,
year,
month,
day,
hour,
minute,
second,
converted_nanos,
offset_seconds,
);
})
})
}
#[no_mangle]
pub extern "C" fn glean_datetime_test_has_value(metric_id: u64, storage_name: FfiStr) -> u8 {
with_glean_value(|glean| {
DATETIME_METRICS.call_infallible(metric_id, |metric| {
metric
.test_get_value_as_string(glean, storage_name.as_str())
.is_some()
})
})
}
#[no_mangle]
pub extern "C" fn glean_datetime_test_get_value_as_string(
metric_id: u64,
storage_name: FfiStr,
) -> *mut c_char {
with_glean_value(|glean| {
DATETIME_METRICS.call_infallible(metric_id, |metric| {
metric
.test_get_value_as_string(glean, storage_name.as_str())
.unwrap()
})
})
}