use crate::errors::DynoxideError;
use rmcp::model::{CallToolResult, Content};
fn short_error_type(err: &DynoxideError) -> &'static str {
match err {
DynoxideError::ResourceNotFoundException(_) => "ResourceNotFoundException",
DynoxideError::ResourceInUseException(_) => "ResourceInUseException",
DynoxideError::ValidationException(_) => "ValidationException",
DynoxideError::ConditionalCheckFailedException(..) => "ConditionalCheckFailedException",
DynoxideError::TransactionCanceledException(..) => "TransactionCanceledException",
DynoxideError::ItemCollectionSizeLimitExceededException(_) => {
"ItemCollectionSizeLimitExceededException"
}
DynoxideError::ProvisionedThroughputExceededException(_) => {
"ProvisionedThroughputExceededException"
}
DynoxideError::InternalServerError(_) | DynoxideError::SqliteError(_) => {
"InternalServerError"
}
DynoxideError::ConversionError(_) => "ValidationException",
DynoxideError::DuplicateItemException(_) => "DuplicateItemException",
DynoxideError::AccessDeniedException(_) => "AccessDeniedException",
DynoxideError::SerializationException(_) => "SerializationException",
DynoxideError::LimitExceededException(_) => "LimitExceededException",
DynoxideError::IdempotentParameterMismatchException(_) => {
"IdempotentParameterMismatchException"
}
}
}
fn is_retryable(err: &DynoxideError) -> bool {
matches!(
err,
DynoxideError::ProvisionedThroughputExceededException(_)
| DynoxideError::InternalServerError(_)
| DynoxideError::SqliteError(_)
)
}
pub fn to_tool_error(err: DynoxideError) -> CallToolResult {
let error_json = serde_json::json!({
"error_type": short_error_type(&err),
"message": err.to_string(),
"retryable": is_retryable(&err),
});
CallToolResult::error(vec![Content::text(error_json.to_string())])
}