use super::{FailureEvent, FMEA_REGISTRY};
use crate::utils::error::{Error, Result};
pub trait FmeaContext<T> {
fn fmea_context(self, mode_id: &str, operation: &str) -> Result<T>;
}
impl<T, E: Into<Error>> FmeaContext<T> for std::result::Result<T, E> {
fn fmea_context(self, mode_id: &str, operation: &str) -> Result<T> {
self.map_err(|e| {
let error: Error = e.into();
if let Ok(mut registry) = FMEA_REGISTRY.write() {
let event = FailureEvent::new(
mode_id.to_string(),
operation.to_string(),
error.to_string(),
);
registry.record_event(event);
}
error
})
}
}
#[macro_export]
macro_rules! fmea_track {
($mode:expr, $op:expr, $block:expr) => {{
use $crate::utils::fmea::FmeaContext;
(|| -> $crate::utils::error::Result<_> { $block })().fmea_context($mode, $op)
}};
}