Error Context Wrapper
Add context to errors for better debugging and error messages
Description
A utility for wrapping errors with additional context information. Helps create more informative error messages by adding contextual data to errors.
Features
- Error context wrapping
- Contextual information
- Error chaining
- Debug information
Code
use std::fmt;#[derive(Debug)]pub struct ContextError { pub context: String, pub source: Box<dyn std::error::Error + Send + Sync>,}impl fmt::Display for ContextError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}: {}", self.context, self.source) }}impl std::error::Error for ContextError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(self.source.as_ref()) }}pub trait ErrorContext<T> { fn context<C: Into<String>>(self, ctx: C) -> Result<T, ContextError>;}impl<T, E: std::error::Error + Send + Sync + 'static> ErrorContext<T> for Result<T, E> { fn context<C: Into<String>>(self, ctx: C) -> Result<T, ContextError> { self.map_err(|e| ContextError { context: ctx.into(), source: Box::new(e), }) }}pub fn with_context<T, E, F, C>(result: Result<T, E>, f: F) -> Result<T, ContextError>where E: std::error::Error + Send + Sync + 'static, F: FnOnce(&E) -> C, C: Into<String>,{ result.map_err(|e| ContextError { context: f(&e).into(), source: Box::new(e), })}
use error_context::{ErrorContext, with_context};use std::fs;fn read_config(path: &str) -> Result<String, Box<dyn std::error::Error>> { fs::read_to_string(path) .context(format!("Failed to read config from config.json"))?; Ok("config content".to_string())}fn process_data(data: &str) -> Result<(), Box<dyn std::error::Error>> { // Some processing Ok(())}let result = read_config("/etc/app/config.json") .and_then(|content| process_data(&content).context("Failed to process data"));
Comments
No comments yet. Be the first to comment!
Please login to leave a comment.