arc-io-error 0.1.1

A version of std::io::Error implemented on top of Arc instead of Box, making it cloneable.
Documentation
# arc-io-error

This library provides the
[`IoError`](https://docs.rs/arc-io-error/0.1.1/arc_io_error/struct.IoError.html)
type, a version of
[`std::io::Error`](https://doc.rust-lang.org/std/io/struct.Error.html)
implemented on top of
[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html) instead
of [`Box`](https://doc.rust-lang.org/std/boxed/struct.Box.html),
making it cloneable.

[![Crates.io](https://img.shields.io/crates/v/arc-io-error.svg)](https://crates.io/crates/arc-io-error)
[![Linux/OSX Build Status](https://img.shields.io/travis/spinda/arc-io-error/master.svg)](https://travis-ci.org/spinda/arc-io-error)
[![Windows Build Status](https://img.shields.io/appveyor/ci/spinda/arc-io-error/master.svg)](https://ci.appveyor.com/project/spinda/arc-io-error)

[Documentation](https://docs.rs/arc-io-error/0.1.1)

## Usage

First, add this to your `Cargo.toml`:

```toml
[dependencies]
arc-io-error = "0.1.1"
```

Next, add this to your crate:

```rust
extern crate arc_io_error;

use arc_io_error::IoError;
```

## Overview

The API of
[`IoError`](https://docs.rs/arc-io-error/0.1.1/arc_io_error/struct.IoError.html)
has been designed to match
[`io::Error`](https://doc.rust-lang.org/std/io/struct.Error.html),
with two exceptions:

- [`IoError::new`]https://docs.rs/arc-io-error/0.1.1/arc_io_error/struct.IoError.html#method.new
  and
  [`IoError::into_inner`]https://docs.rs/arc-io-error/0.1.1/arc_io_error/struct.IoError.html#method.into_inner
  substitute
  [`Arc`]https://doc.rust-lang.org/std/sync/struct.Arc.html for
  [`Box`]https://doc.rust-lang.org/std/boxed/struct.Box.html, and
- [`IoError`]https://docs.rs/arc-io-error/0.1.1/arc_io_error/struct.IoError.html
  has no equivalent to
  [`io::Error::get_mut`]https://doc.rust-lang.org/std/io/struct.Error.html#method.get_mut,
  as the inner error instance is shared.

[`IoError`](https://docs.rs/arc-io-error/0.1.1/arc_io_error/struct.IoError.html)
implements
[`From`](https://doc.rust-lang.org/std/convert/trait.From.html)
for [`io::Error`](https://doc.rust-lang.org/std/io/struct.Error.html)
and vice-versa, so the two types can easily be converted between each other.
A type containing
[`io::Error`](https://doc.rust-lang.org/std/io/struct.Error.html) can
be made
[`Clone`](https://doc.rust-lang.org/std/clone/trait.Clone.html)-compatible
by instead storing
[`IoError`](https://docs.rs/arc-io-error/0.1.1/arc_io_error/struct.IoError.html)
internally and converting from/to
[`io::Error`](https://doc.rust-lang.org/std/io/struct.Error.html) on API
boundaries.

Clones derived from the same original
[`IoError`](https://docs.rs/arc-io-error/0.1.1/arc_io_error/struct.IoError.html)
instance will share a single heap-allocated error instance (if one is
present) using
[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html).
[`io::Error`](https://doc.rust-lang.org/std/io/struct.Error.html)
instances produced by converting those clones back with the
[`From`](https://doc.rust-lang.org/std/convert/trait.From.html)
implementation will also share the same single error instance.

## License

Licensed under either of

 * [Apache License, Version 2.0]/LICENSE-APACHE
 * [MIT License]/LICENSE-MIT

at your option.

### Contribution

Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in the work by you, as defined in the Apache-2.0
license, shall be dual licensed as above, without any additional terms or
conditions.