use std::ffi::{CStr, NulError};
use std::fmt;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
Ffi(String),
InteriorNul,
InvalidUtf8,
Timeout,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Ffi(m) => write!(f, "adamo: {m}"),
Error::InteriorNul => f.write_str("adamo: string contained an interior NUL byte"),
Error::InvalidUtf8 => f.write_str("adamo: FFI returned non-UTF-8 data"),
Error::Timeout => f.write_str("adamo: receive timed out"),
}
}
}
impl std::error::Error for Error {}
impl From<NulError> for Error {
fn from(_: NulError) -> Self {
Error::InteriorNul
}
}
pub(crate) fn last_ffi_error() -> Error {
unsafe {
let ptr = adamo_sys::adamo_last_error();
if ptr.is_null() {
return Error::Ffi("(no error message)".into());
}
match CStr::from_ptr(ptr).to_str() {
Ok(s) => Error::Ffi(s.to_owned()),
Err(_) => Error::InvalidUtf8,
}
}
}