flexible-io 0.4.0

Wraps values such that dyn-safe IO traits need not appear as static bounds
Documentation
#[path = "motivation.rs"]
mod motivation;

use flexible_io::{reader::ReaderBox, Reader};

use motivation::{read_with_skip, IoReport};

#[test]
fn boxed_case() {
    let data: &'static [u8] = b"Hello, world!";
    let read = Reader::new(std::io::Cursor::new(data));

    check_boxed(
        read.into_boxed(),
        IoReport {
            num_seek: 0,
            num_read: 3,
        },
    );

    let mut read = Reader::new(std::io::Cursor::new(data));
    read.set_seek();

    check_boxed(
        read.into_boxed(),
        IoReport {
            num_seek: 1,
            num_read: 2,
        },
    );
}

fn check_boxed(mut boxed: ReaderBox<'_>, expect: IoReport) {
    let mut buffer = vec![];
    let report = read_with_skip(boxed.as_mut(), 7, &mut buffer).unwrap();
    assert_eq!(buffer, b"world!");
    assert_eq!(report.num_seek, expect.num_seek);
    assert!(report.num_read >= expect.num_read);
}