1use std::time::{Duration, SystemTime, UNIX_EPOCH};
16
17macro_rules! ffi_wrap {
18 ($n:expr, $b:expr) => {{
19 use std::panic;
20 use std::process;
21
22 panic::catch_unwind(|| $b).unwrap_or_else(|_| {
23 ::tracing::error!("ffi callback caught panic: {}", $n);
24 process::abort()
25 })
26 }};
27}
28
29pub(crate) fn time_from_bn(timestamp: u64) -> SystemTime {
30 let m = Duration::from_secs(timestamp);
31 UNIX_EPOCH + m
32}
33
34#[macro_export]
35macro_rules! ffi_span {
36 ($name:expr, $bv:expr) => {{
37 #[allow(unused_imports)]
38 use $crate::file_metadata::FileMetadata;
39 ::tracing::info_span!($name, session_id = $bv.file().session_id().0).entered()
40 }};
41 ($name:expr) => {
42 ::tracing::info_span!($name).entered()
43 };
44}
45
46macro_rules! new_id_type {
47 ($name:ident, $inner_type:ty) => {
48 #[derive(std::fmt::Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
49 pub struct $name(pub $inner_type);
50
51 impl From<$inner_type> for $name {
52 fn from(value: $inner_type) -> Self {
53 Self(value)
54 }
55 }
56
57 impl From<$name> for $inner_type {
58 fn from(value: $name) -> Self {
59 value.0
60 }
61 }
62
63 impl std::fmt::Display for $name {
64 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
65 write!(f, "{}", self.0)
66 }
67 }
68 };
69}