Error Context Wrapper

Add context to errors for better debugging and error messages

rust (1.70) 2025-11-12 error-handling debugging context utility

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

RAW
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),    })}
RAW
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!