use crate::error::{Error, Result};
use std::ffi::CStr;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Versions {
pub empyrean_core: String,
pub villeneuve: String,
pub scott: String,
pub nolan: String,
}
pub fn version_string() -> Result<String> {
let raw = unsafe { empyrean_sys::empyrean_version_string() };
if raw.is_null() {
return Err(Error::capture(-1));
}
let s = unsafe { CStr::from_ptr(raw) }
.to_str()
.map(|s| s.to_string())
.map_err(|_| Error::invalid_input("version string is not valid UTF-8"));
unsafe { empyrean_sys::empyrean_string_free(raw) };
s
}
pub fn versions() -> Result<Versions> {
let mut raw = empyrean_sys::EmpyreanVersions {
empyrean_core: std::ptr::null_mut(),
villeneuve: std::ptr::null_mut(),
scott: std::ptr::null_mut(),
nolan: std::ptr::null_mut(),
};
let code = unsafe { empyrean_sys::empyrean_versions(&mut raw) };
if code != 0 {
return Err(Error::capture(code));
}
let take = |p: *mut std::ffi::c_char| -> Result<String> {
if p.is_null() {
return Err(Error::invalid_input("version field is null"));
}
unsafe { CStr::from_ptr(p) }
.to_str()
.map(|s| s.to_string())
.map_err(|_| Error::invalid_input("version field is not valid UTF-8"))
};
let result = (|| {
Ok(Versions {
empyrean_core: take(raw.empyrean_core)?,
villeneuve: take(raw.villeneuve)?,
scott: take(raw.scott)?,
nolan: take(raw.nolan)?,
})
})();
unsafe { empyrean_sys::empyrean_versions_free(&mut raw) };
result
}