use dart_sys::{Dart_DeletePersistentHandle_DL, Dart_Handle, Dart_HandleFromPersistent_DL};
use dart_sys::{Dart_NewPersistentHandle_DL, Dart_PersistentHandle};
#[derive(Debug)]
pub struct AutoDropDartPersistentHandle(Option<Dart_PersistentHandle>);
impl AutoDropDartPersistentHandle {
pub fn new_from_non_persistent_handle(non_persistent_handle: Dart_Handle) -> Self {
unsafe {
let persistent_handle = Dart_NewPersistentHandle_DL
.expect("dart_api_dl has not been initialized")(
non_persistent_handle
);
Self::from_raw(persistent_handle)
}
}
unsafe fn from_raw(ptr: Dart_PersistentHandle) -> Self {
Self(Some(ptr))
}
pub fn create_dart_handle(&self) -> Dart_Handle {
unsafe {
Dart_HandleFromPersistent_DL.expect("dart_api_dl has not been initialized")(
self.0.unwrap(),
)
}
}
}
impl Drop for AutoDropDartPersistentHandle {
fn drop(&mut self) {
if let Some(inner) = self.0 {
unsafe {
Dart_DeletePersistentHandle_DL.expect("dart_api_dl has not been initialized")(inner)
}
}
}
}