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