use super::super::raw::Library;
use super::super::Error;
use std::ops::{Deref, DerefMut};
use super::api::WrapperApi;
use std::ffi::OsStr;
pub struct Container<T>
where
T: WrapperApi,
{
#[allow(dead_code)]
lib: Library,
api: T,
}
impl<T> Container<T>
where
T: WrapperApi,
{
pub unsafe fn load<S>(name: S) -> Result<Container<T>, Error>
where
S: AsRef<OsStr>,
{
let lib = Library::open(name)?;
let api = T::load(&lib)?;
Ok(Self { lib: lib, api: api })
}
pub unsafe fn load_self() -> Result<Container<T>, Error> {
let lib = Library::open_self()?;
let api = T::load(&lib)?;
Ok(Self { lib: lib, api: api })
}
}
impl<T> Deref for Container<T>
where
T: WrapperApi,
{
type Target = T;
fn deref(&self) -> &T {
&self.api
}
}
impl<T> DerefMut for Container<T>
where
T: WrapperApi,
{
fn deref_mut(&mut self) -> &mut T {
&mut self.api
}
}