use std::ffi::CStr;
use super::symbol::Symbol;
use super::ptr_or_null::PtrOrNull;
use super::ptr_or_null_mut::PtrOrNullMut;
use super::super::raw::Library as RawLib;
use std::ffi::{CString, OsStr};
use std::ptr::{null, null_mut};
use super::super::err::Error;
pub struct Library {
lib: RawLib,
}
impl Library {
pub fn open<S>(name: S) -> Result<Library, Error>
where
S: AsRef<OsStr>,
{
Ok(Library {
lib: RawLib::open(name)?,
})
}
pub fn open_self() -> Result<Library, Error> {
Ok(Library {
lib: RawLib::open_self()?,
})
}
pub unsafe fn symbol<T>(&self, name: &str) -> Result<Symbol<T>, Error> {
Ok(Symbol::new(self.lib.symbol(name)?))
}
pub unsafe fn symbol_cstr<T>(&self, name: &CStr) -> Result<Symbol<T>, Error> {
Ok(Symbol::new(self.lib.symbol_cstr(name)?))
}
pub unsafe fn ptr_or_null<T>(&self, name: &str) -> Result<PtrOrNull<T>, Error> {
let cname = CString::new(name)?;
self.ptr_or_null_cstr(cname.as_ref())
}
pub unsafe fn ptr_or_null_cstr<T>(&self, name: &CStr) -> Result<PtrOrNull<T>, Error> {
let raw_ptr = match self.lib.symbol_cstr(name) {
Ok(val) => val,
Err(err) => match err {
Error::NullSymbol => null(),
_ => return Err(err),
},
};
Ok(PtrOrNull::new(raw_ptr))
}
pub unsafe fn ptr_or_null_mut<T>(&self, name: &str) -> Result<PtrOrNullMut<T>, Error> {
let cname = CString::new(name)?;
self.ptr_or_null_mut_cstr(cname.as_ref())
}
pub unsafe fn ptr_or_null_mut_cstr<T>(&self, name: &CStr) -> Result<PtrOrNullMut<T>, Error> {
let raw_ptr = match self.lib.symbol_cstr(name) {
Ok(val) => val,
Err(err) => match err {
Error::NullSymbol => null_mut(),
_ => return Err(err),
},
};
Ok(PtrOrNullMut::new(raw_ptr))
}
pub unsafe fn reference<T>(&self, name: &str) -> Result<&T, Error> {
self.lib.symbol(name)
}
pub unsafe fn reference_cstr<T>(&self, name: &CStr) -> Result<&T, Error> {
self.lib.symbol_cstr(name)
}
pub unsafe fn reference_mut<T>(&self, name: &str) -> Result<&mut T, Error> {
self.lib.symbol(name)
}
pub unsafe fn reference_mut_cstr<T>(&self, name: &CStr) -> Result<&mut T, Error> {
self.lib.symbol_cstr(name)
}
}
unsafe impl Send for Library {}
unsafe impl Sync for Library {}