use std::ffi::c_void;
use std::ptr::{self, NonNull};
use std::sync::Arc;
use libusbk_sys::LstK_Init;
use crate::device_list::DeviceList;
use crate::error::{self, try_unsafe};
type KListHandle = NonNull<c_void>;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Context {
context: Arc<ContextInner>,
}
#[derive(Debug, Eq, PartialEq)]
struct ContextInner {
inner: KListHandle,
}
impl Drop for ContextInner {
fn drop(&mut self) {
unsafe {}
}
}
impl Context {
pub fn new() -> crate::Result<Self> {
let mut context = std::mem::MaybeUninit::<*mut c_void>::uninit();
try_unsafe!(LstK_Init(context.as_mut_ptr(), 0));
Ok(Self {
context: unsafe {
Arc::new(ContextInner {
inner: ptr::NonNull::new_unchecked(context.assume_init()),
})
},
})
}
fn as_raw(&self) -> *mut c_void {
self.context.inner.as_ptr()
}
}