use alloc::string::String;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i32)]
pub enum RmwRet {
Ok = 0,
Error = 1,
Timeout = 2,
Unsupported = 3,
BadAlloc = 10,
InvalidArgument = 11,
IncorrectRmwImplementation = 12,
}
impl RmwRet {
#[must_use]
pub const fn is_ok(self) -> bool {
matches!(self, Self::Ok)
}
#[must_use]
pub const fn to_i32(self) -> i32 {
self as i32
}
}
pub const RMW_IMPLEMENTATION_IDENTIFIER: &str = "rmw_zerodds_cpp";
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RmwNode {
pub implementation_identifier: String,
pub name: String,
pub namespace: String,
pub domain_id: u32,
}
pub fn check_rmw_identifier(actual: &str) -> Result<(), RmwRet> {
if actual == RMW_IMPLEMENTATION_IDENTIFIER {
Ok(())
} else {
Err(RmwRet::IncorrectRmwImplementation)
}
}
#[must_use]
pub fn map_to_rmw_ret<E>(r: Result<(), E>) -> RmwRet {
match r {
Ok(()) => RmwRet::Ok,
Err(_) => RmwRet::Error,
}
}
#[cfg(test)]
#[allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
mod tests {
use super::*;
#[test]
fn ok_is_zero() {
assert_eq!(RmwRet::Ok.to_i32(), 0);
assert!(RmwRet::Ok.is_ok());
}
#[test]
fn error_codes_match_rmw_h() {
assert_eq!(RmwRet::Error.to_i32(), 1);
assert_eq!(RmwRet::Timeout.to_i32(), 2);
assert_eq!(RmwRet::Unsupported.to_i32(), 3);
assert_eq!(RmwRet::BadAlloc.to_i32(), 10);
assert_eq!(RmwRet::InvalidArgument.to_i32(), 11);
assert_eq!(RmwRet::IncorrectRmwImplementation.to_i32(), 12);
}
#[test]
fn implementation_identifier_matches_convention() {
assert!(RMW_IMPLEMENTATION_IDENTIFIER.starts_with("rmw_"));
assert!(RMW_IMPLEMENTATION_IDENTIFIER.ends_with("_cpp"));
}
#[test]
fn check_rmw_identifier_accepts_correct() {
check_rmw_identifier(RMW_IMPLEMENTATION_IDENTIFIER).unwrap();
}
#[test]
fn check_rmw_identifier_rejects_other_vendor() {
assert_eq!(
check_rmw_identifier("rmw_cyclonedds_cpp"),
Err(RmwRet::IncorrectRmwImplementation)
);
}
#[test]
fn map_to_rmw_ret_ok() {
let r: Result<(), &str> = Ok(());
assert_eq!(map_to_rmw_ret(r), RmwRet::Ok);
}
#[test]
fn map_to_rmw_ret_err() {
let r: Result<(), &str> = Err("boom");
assert_eq!(map_to_rmw_ret(r), RmwRet::Error);
}
#[test]
fn rmw_node_construction() {
let n = RmwNode {
implementation_identifier: RMW_IMPLEMENTATION_IDENTIFIER.into(),
name: "talker".into(),
namespace: "/".into(),
domain_id: 42,
};
assert_eq!(n.domain_id, 42);
}
}