use core::ffi::c_char;
use mbus_client_async::AsyncError;
use mbus_core::errors::MbusError;
use crate::c::error::MbusStatusCode;
pub type MbusDnStatus = MbusStatusCode;
#[unsafe(no_mangle)]
pub extern "C" fn mbus_dn_status_str(status: MbusDnStatus) -> *const c_char {
crate::c::error::mbus_status_str(status)
}
pub(crate) fn from_async(err: AsyncError) -> MbusDnStatus {
match err {
AsyncError::Mbus(e) => MbusStatusCode::from(e),
AsyncError::WorkerClosed => MbusStatusCode::MbusErrConnectionClosed,
AsyncError::UnexpectedResponseType => MbusStatusCode::MbusErrUnexpectedResponse,
AsyncError::Timeout => MbusStatusCode::MbusErrTimeout,
}
}
#[allow(dead_code)]
pub(crate) fn from_mbus(err: MbusError) -> MbusDnStatus {
MbusStatusCode::from(err)
}
#[cfg(test)]
mod tests {
use super::*;
use core::ffi::CStr;
#[test]
fn dn_status_str_returns_same_text_as_c_status_str() {
let dn = unsafe { CStr::from_ptr(mbus_dn_status_str(MbusStatusCode::MbusOk)) };
let c = unsafe { CStr::from_ptr(crate::c::error::mbus_status_str(MbusStatusCode::MbusOk)) };
assert_eq!(dn.to_bytes(), c.to_bytes());
}
#[test]
fn from_async_maps_every_variant() {
assert_eq!(
from_async(AsyncError::Timeout),
MbusStatusCode::MbusErrTimeout
);
assert_eq!(
from_async(AsyncError::WorkerClosed),
MbusStatusCode::MbusErrConnectionClosed
);
assert_eq!(
from_async(AsyncError::UnexpectedResponseType),
MbusStatusCode::MbusErrUnexpectedResponse
);
assert_eq!(
from_async(AsyncError::Mbus(MbusError::ConnectionFailed)),
MbusStatusCode::MbusErrConnectionFailed
);
}
}