use coco_sys::coco_observer_t;
use std::ffi::{CStr, CString};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Name {
Bbob,
BbobBiobj,
Toy,
None,
}
impl Name {
fn as_str(&self) -> &'static str {
match self {
Name::Bbob => "bbob",
Name::BbobBiobj => "bbob-biobj",
Name::Toy => "toy",
Name::None => "no-observer",
}
}
}
pub struct Observer {
pub(crate) inner: *mut coco_observer_t,
}
impl Observer {
pub fn new(name: Name, options: &str) -> Option<Observer> {
let name = CString::new(name.as_str()).unwrap();
let options = CString::new(options).unwrap();
let inner = unsafe { coco_sys::coco_observer(name.as_ptr(), options.as_ptr()) };
if inner.is_null() {
None
} else {
Some(Observer { inner })
}
}
pub fn result_folder(&self) -> &str {
unsafe {
CStr::from_ptr(coco_sys::coco_observer_get_result_folder(self.inner))
.to_str()
.unwrap()
}
}
}
impl Drop for Observer {
fn drop(&mut self) {
unsafe {
coco_sys::coco_observer_free(self.inner);
}
}
}