easy-error 1.0.0

Simple error utilities
Documentation
# Easy-error

[![docs.rs](https://docs.rs/easy-error/badge.svg)](https://docs.rs/easy-error)
[![crates.io](http://img.shields.io/crates/v/easy-error.svg)](http://crates.io/crates/easy-error)
![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)
![Rustc 1.46+](https://img.shields.io/badge/rustc-1.46+-lightgray.svg)
![Pipeline](https://gitlab.com/neachdainn/easy-error/badges/master/pipeline.svg)

This crate is a lightweight error handling library meant to play well with the standard `Error` trait.
It is designed for quick prototyping or for Command-line applications where any error will simply bubble up to the user.
There are four major components of this crate:

1. A basic, string-based error type that is meant for either quick prototyping or human-facing errors.
2. A nice way to iterate over the causes of an error.
3. Some macros that make returning errors slightly more ergonomic.
4. A "termination" type that produces nicely formatted error messages when returned from the `main` function.

## Rust Version Requirements

The current version requires **Rustc 1.46 or newer**.
In general, this crate will be compilable with the Rustc version available on the oldest supported Ubuntu LTS release.
Any change that requires a newer version of Rustc than what is available on the oldest supported Ubuntu LTS will be considered a breaking change.

## Example

```rust
use std::{fs::File, io::Read};
use easy_error::{bail, ensure, Error, ResultExt, Terminator};

fn from_file() -> Result<i32, Error> {
    let file_name = "example.txt";
    let mut file = File::open(file_name).context("Could not open file")?;

    let mut contents = String::new();
    file.read_to_string(&mut contents).context("Unable to read file")?;

    contents.trim().parse().context("Could not parse file")
}

fn validate(value: i32) -> Result<(), Error> {
    ensure!(value > 0, "Value must be greater than zero (found {})", value);

    if value % 2 == 1 {
        bail!("Only even numbers can be used");
    }

    Ok(())
}

fn main() -> Result<(), Terminator> {
    let value = from_file().context("Unable to get value from file")?;
    validate(value).context("Value is not acceptable")?;

    println!("Value = {}", value);
    Ok(())
}
```