eieio — Error Implementing Eq + Clone replacing std::io::Error

eieio::Error is a replacement of std::io::Error which implements Eq + Clone. This type is intended as a "source" of other errors where a derived Eq + Clone implemented is desired.

```rust // Constructs a standard io::Error... let ioe = std::fs::readdir("/dev/null").unwraperr();

// Converts into an Eq + Clone error let e1 = eieio::Error::from(ioe); let e2 = e1.clone(); assert_eq!(e1, e2); ```

Clone

eieio::Error stores custom errors in an Arc rather than a Box to allow universal cloning.

Conversion from std::io::Error to eieio::Error may need to perform a copy of the entire custom error.

Equality

eieio::Error uses Arc::ptr_eq to compare equality of custom errors.

If the custom error carried by the original std::io::Error itself implements Eq, that custom equality is ignored:

```rust use std::io::ErrorKind;

let e1 = eieio::Error::new(ErrorKind::Other, Box::from("foo")); let e2 = eieio::Error::new(ErrorKind::Other, Box::from("foo")); assert_ne!(e1, e2); ```