HA

handling-rust-errors

Standardizes Rust error handling using the error-stack crate and provides guidance on contextual error reporting.

Install

mkdir -p .claude/skills/handling-rust-errors && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/2724" && unzip -o skill.zip -d .claude/skills/handling-rust-errors && rm skill.zip

Installs to .claude/skills/handling-rust-errors

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

HASH error handling patterns using error-stack crate. Use when working with Result types, Report types, defining custom errors, propagating errors with change_context, adding context with attach, implementing Error trait, or documenting error conditions in Rust code.
267 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Intermediate

Key capabilities

  • Uses Report<MyError> for consistent error propagation
  • Attaches contextual info to results using the attach method
  • Standardizes error definition without using standard library error types
  • Enforces usage of derive_more instead of thiserror

How it works

Applies a set of rigid imports and trait-method rules to wrap and propagate errors according to project coding standards.

Inputs & outputs

You give it
Result type or error definition
You get back
Error-stack compliant error implementation

When to use handling-rust-errors

  • Implementing error propagation
  • Attaching context to Rust Result types
  • Defining custom error traits
  • Refactoring error handling code

About this skill

Rust Error-Stack Patterns

HASH-specific error handling patterns using the error-stack crate for consistent, debuggable error handling across the Rust codebase.

Core Principles

HASH uses error-stack exclusively for error handling:

DO:

  • Use Report<MyError> for all error types
  • Use concrete error types: Report<MyError>
  • Import Error from core::error:: (not std::error::)
  • Import ResultExt as _ for trait methods

DON'T:

  • Use anyhow or eyre crates
  • Use Box<dyn Error> (except in tests/prototyping)
  • Use Report<Box<dyn Error>>
  • Use thiserror (use derive_more instead)

HashQL Compiler Exception

HashQL compiler code uses a different error handling approach.

Code in libs/@local/hashql/* uses the hashql-diagnostics crate instead of error-stack. This is because compiler errors require rich formatting capabilities:

  • Source spans pointing to exact code locations
  • Multiple labeled regions within the same diagnostic
  • Fix suggestions with replacement text
  • Severity levels (error, warning, hint)

Which approach to use:

LocationError Handling
libs/@local/hashql/* (compiler code)Use hashql-diagnostics → See writing-hashql-diagnostics skill
Everywhere elseUse error-stack patterns from this skill

Traditional error-stack patterns still apply for HashQL infrastructure code (CLI, file I/O, configuration) that doesn't involve compiler diagnostics.

Quick Start Guide

Choose the reference that matches your current task:

Defining Errors

Use when: Creating new error types or error enums

  • Define error types with derive_more
  • Error enum patterns and variants
  • Implement the Error trait
  • Error type hierarchies

Propagating Errors

Use when: Handling Result types, using ? operator

  • Convert errors with .change_context() and .change_context_with()
  • Add context with .attach() and .attach_with()
  • Error conversion patterns

Documenting Errors

Use when: Writing doc comments for fallible functions

  • # Errors section format
  • Link error variants
  • Document runtime errors
  • Test error conditions

Common Quick Patterns

Creating an Error

use error_stack::Report;

return Err(Report::new(MyError::NotFound))
    .attach(format!("ID: {}", id));

Propagating with Context

use error_stack::ResultExt as _;

some_result
    .change_context(MyError::OperationFailed)
    .attach("Additional context")?;

Lazy Context (for expensive operations)

use error_stack::ResultExt as _;

expensive_operation()
    .change_context(MyError::OperationFailed)
    .attach_with(|| format!("Debug info: {:?}", expensive_computation()))?;

References

When not to use it

  • In the HashQL compiler module where diagnostics are required
  • When prototyping simple CLI tools where anyhow suffices

Prerequisites

Rust toolchainError-stack crate

Limitations

  • Requires explicit import management of Error traits
  • Not compatible with standard diagnostic-heavy compiler code

How it compares

It enforces a HASH-specific standard by banning common Rust error crates like anyhow and thiserror.

Compared to similar skills

handling-rust-errors side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
handling-rust-errors (this skill)42moNo flagsIntermediate
debug-cli18moReviewIntermediate
fix-clippy36moNo flagsBeginner
search-code24moReviewIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry