newer-type-std 0.3.0

Support defining newtype wrapper with inheriting trait implementations
Documentation
use newer_type::implement;
use std::io::{BufRead, Cursor, Read, Seek, SeekFrom, Write};

#[implement(
    newer_type_std::io::Read,
    newer_type_std::io::Write,
    newer_type_std::io::Seek,
    newer_type_std::io::BufRead
)]
pub struct MyIoStruct {
    inner: Cursor<Vec<u8>>,
}

#[test]
fn test_io_read() {
    let data = b"abcde12345".to_vec();
    let mut wrapper = MyIoStruct {
        inner: Cursor::new(data),
    };
    let mut buf = [0u8; 5];
    wrapper.read_exact(&mut buf).unwrap();
    assert_eq!(&buf, b"abcde");
}

#[test]
fn test_io_seek_and_bufread() {
    let data = b"line1\nline2\n".to_vec();
    let mut wrapper = MyIoStruct {
        inner: Cursor::new(data),
    };
    wrapper.seek(SeekFrom::Start(6)).unwrap();
    let mut line = String::new();
    wrapper.read_line(&mut line).unwrap();
    assert_eq!(line.trim_end(), "line2");
}

#[test]
fn test_io_write() {
    let mut writer = MyIoStruct {
        inner: Cursor::new(Vec::new()),
    };
    writer.write_all(b"hello world").unwrap();
    assert_eq!(writer.inner.get_ref(), b"hello world");
}

#[implement(
    newer_type_std::io::Read,
    newer_type_std::io::Write,
    newer_type_std::io::BufRead,
    newer_type_std::io::Seek
)]
pub enum MyIoEnum {
    A(Cursor<Vec<u8>>),
    B(Cursor<Vec<u8>>),
}

#[test]
fn test_io_enum_read_write_seek() {
    let mut wrapper = MyIoEnum::A(Cursor::new(b"abcdef".to_vec()));
    let mut buf = [0u8; 3];
    wrapper.read_exact(&mut buf).unwrap();
    assert_eq!(&buf, b"abc");

    let s = vec![0x78_u8, 0x79, 0x7a];
    let mut wrapper = MyIoEnum::B(Cursor::new(s));
    let mut buf2 = Vec::new();
    wrapper.read_to_end(&mut buf2).unwrap();
    assert_eq!(&buf2, b"xyz");
}