use core::ffi::CStr;
use core::ptr::NonNull;
pub struct UnsafeRecord<T> {
name: &'static CStr,
raw: NonNull<T>,
}
impl<T> UnsafeRecord<T> {
pub unsafe fn open(name: &'static CStr) -> Self {
Self {
name,
raw: unsafe { NonNull::new_unchecked(crate::furi_record_open(name.as_ptr()).cast()) },
}
}
pub fn as_ptr(&self) -> *mut T {
self.raw.as_ptr()
}
}
impl<T> Clone for UnsafeRecord<T> {
fn clone(&self) -> Self {
unsafe { Self::open(self.name) }
}
}
impl<T> Drop for UnsafeRecord<T> {
fn drop(&mut self) {
unsafe {
crate::furi_record_close(self.name.as_ptr());
}
}
}