use std::ffi::CString;
use crate::{
error::catch_quest_exception,
ffi,
QuestError,
};
#[derive(Debug)]
pub struct QuestEnv(pub(crate) ffi::QuESTEnv);
impl QuestEnv {
#[must_use]
pub fn new() -> Self {
Self(unsafe { ffi::createQuESTEnv() })
}
pub fn sync(&self) {
unsafe {
ffi::syncQuESTEnv(self.0);
}
}
pub fn report_quest_env(&self) {
catch_quest_exception(|| unsafe {
ffi::reportQuESTEnv(self.0);
})
.expect("report_quest_env should always succeed");
}
pub fn get_environment_string(&self) -> Result<String, QuestError> {
let mut cstr =
CString::new("CUDA=x OpenMP=x MPI=x threads=xxxxxxx ranks=xxxxxxx")
.map_err(QuestError::NulError)?;
catch_quest_exception(|| {
unsafe {
let cstr_ptr = cstr.into_raw();
ffi::getEnvironmentString(self.0, cstr_ptr);
cstr = CString::from_raw(cstr_ptr);
}
cstr.into_string().map_err(QuestError::IntoStringError)
})
.expect("get_environment_string should always succeed")
}
}
impl Default for QuestEnv {
fn default() -> Self {
Self::new()
}
}
impl Drop for QuestEnv {
fn drop(&mut self) {
catch_quest_exception(|| unsafe { ffi::destroyQuESTEnv(self.0) })
.expect("dropping QuestEnv should always succeed");
}
}