1use crate::Event;
4
5pub trait Extract: Sized {
7 unsafe fn extract(event: &Event) -> Self;
12}
13
14pub trait TryExtract: Sized + Extract {
16 #[inline]
18 fn try_extract(event: &Event) -> Option<Self> {
19 Self::can_extract(event).then(|| unsafe { Self::extract(event) })
20 }
21
22 fn can_extract(event: &Event) -> bool;
24}
25
26macro_rules! transmute_field {
33 ( $event: ident . $field: ident as $ty: tt ) => {{
34 const _: () = {
35 let end = ::memoffset::offset_of!($crate::Event, $field) + ::std::mem::size_of::<$ty>();
36 assert!(
37 end <= ::std::mem::size_of::<$crate::Event>(),
38 "transmute field outside of event",
39 );
40 };
41
42 let event: &$crate::Event = ::std::borrow::Borrow::borrow($event);
43 let field_ptr = ::std::ptr::addr_of!(event.$field);
44 (*field_ptr.cast::<$ty>()).clone()
45 }};
46}
47
48pub(crate) use transmute_field;