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 use $crate::binary_view::BinaryViewExt;
38 #[allow(unused_imports)]
39 use $crate::file_metadata::FileMetadata;
40 ::tracing::info_span!($name, session_id = $bv.file().session_id().0).entered()
41 }};
42 ($name:expr) => {
43 ::tracing::info_span!($name).entered()
44 };
45}
46
47macro_rules! new_id_type {
48 ($name:ident, $inner_type:ty) => {
49 #[derive(std::fmt::Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
50 pub struct $name(pub $inner_type);
51
52 impl From<$inner_type> for $name {
53 fn from(value: $inner_type) -> Self {
54 Self(value)
55 }
56 }
57
58 impl From<$name> for $inner_type {
59 fn from(value: $name) -> Self {
60 value.0
61 }
62 }
63
64 impl std::fmt::Display for $name {
65 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
66 write!(f, "{}", self.0)
67 }
68 }
69 };
70}