use crate::error::DrasiError;
use anyhow::Result as AnyhowResult;
pub fn map_component_error<T>(
result: AnyhowResult<T>,
component_type: &str,
component_id: &str,
operation: &str,
) -> crate::error::Result<T> {
result.map_err(|e| {
DrasiError::operation_failed(component_type, component_id, operation, e.to_string())
})
}
pub fn map_state_error<T>(
result: AnyhowResult<T>,
_component_type: &str,
_component_id: &str,
) -> crate::error::Result<T> {
result.map_err(|e| DrasiError::invalid_state(e.to_string()))
}
#[cfg(test)]
mod tests {
use super::*;
use anyhow::anyhow;
#[test]
fn test_map_component_error_success() {
let result: AnyhowResult<i32> = Ok(42);
let mapped = map_component_error(result, "source", "test-id", "start");
assert!(mapped.is_ok());
assert_eq!(mapped.unwrap(), 42);
}
#[test]
fn test_map_component_error_failure() {
let result: AnyhowResult<()> = Err(anyhow!("Connection timeout"));
let mapped = map_component_error(result, "query", "test-query", "stop");
assert!(mapped.is_err());
let err = mapped.unwrap_err();
match err {
DrasiError::OperationFailed {
component_type,
component_id,
operation,
reason,
} => {
assert_eq!(component_type, "query");
assert_eq!(component_id, "test-query");
assert_eq!(operation, "stop");
assert!(reason.contains("Connection timeout"));
}
_ => panic!("Expected OperationFailed variant"),
}
}
#[test]
fn test_map_state_error_success() {
let result: AnyhowResult<String> = Ok("success".to_string());
let mapped = map_state_error(result, "reaction", "test-reaction");
assert!(mapped.is_ok());
assert_eq!(mapped.unwrap(), "success");
}
#[test]
fn test_map_state_error_failure() {
let result: AnyhowResult<()> = Err(anyhow!("Component is already running"));
let mapped = map_state_error(result, "source", "running-source");
assert!(mapped.is_err());
let err = mapped.unwrap_err();
match err {
DrasiError::InvalidState { message } => {
assert!(message.contains("already running"));
}
_ => panic!("Expected InvalidState variant"),
}
}
}