# Blunder

A common error struct for elixir apps

## Usage

Blunder structs give you a common, expressive error type to rase in exceptions return in `{:error, %Blunder{}}` tuples. This gives you a lot more expressiveness than `{:error, "error string"}`. The `%Blunder{}` struct has the following properties you can set.

* `code` - An atom describing the error in a machine-readable way. Defaults to `:application_error`
* `summary` - A short description of the error, suitable for display to users
* `details` - A more detailed description of the error, suitable for logging or alerting.
* `severity` - An atom indicating of the severity of the error, can be used to determine what to log, for example.
* `stacktrace` - Allows you to attach a stacktrace to the error, `nil` by default
* `original_error` - The original error if this Blunder error is wrapping a lower-level exception

In order to simplify the creation of these error structs you're encouraged to create an `Errors` module in your app that exports functions for creating Blunder errors. This serves as a conveniance as well as a central place to document error types. Blunder provides the `deferror` macro in `Blunder.Errors` to make this easier.

defmodule MyApp.Errors do
  import Blunder.Errors

  deferror :flagrant_system_error, 
    message: "MUCH ERRORZ!",
    severity: :critical

  deferror :boring_error, message: "whatevs"

defmodule MyApp.DoTheWork do
  import MyApp.Errors

  def add(x, y) do
    case get_system_status do
      :server_is_on_fire -> {:error, flagrant_system_error()},
      :server_is_le_tired -> {:error, boring_error()},
      :server_ready_to_work -> {:ok, x + y},