pub(crate) fn at_list_element(
error: bacnet_types::error::Error,
index: usize,
) -> bacnet_types::error::Error {
use bacnet_types::error::{Error, ErrorDetail};
match error {
Error::Protocol { class, code } => {
let position = u32::try_from(index).map_or(u32::MAX, |index| index.saturating_add(1));
Error::protocol(
class,
code,
Some(ErrorDetail::FirstFailedElementNumber(position)),
)
}
other => other,
}
}
#[cfg(test)]
pub(crate) fn assert_list_element_refused<T: std::fmt::Debug>(
result: Result<T, bacnet_types::error::Error>,
class: bacnet_types::enums::ErrorClass,
code: bacnet_types::enums::ErrorCode,
position: u32,
context: &str,
) {
use bacnet_types::error::{Error, ErrorDetail};
match result {
Err(Error::Structured {
class: actual_class,
code: actual_code,
detail,
}) => {
assert_eq!(actual_class, class.to_raw() as u32, "{context}: class");
assert_eq!(actual_code, code.to_raw() as u32, "{context}: {code:?}");
assert_eq!(
*detail,
ErrorDetail::FirstFailedElementNumber(position),
"{context}: element"
);
}
other => panic!("{context}: expected {class:?}/{code:?} at {position}, got {other:?}"),
}
}