iof 0.5.0

Read from and write data to console or file in simple formats.
Documentation
use fmt::Default;
use iof::*;
use std::{io::Cursor, num::NonZero, str::from_utf8};

#[test]
fn read_tuple_3() {
    let reader = Cursor::new("1 2 3".as_bytes());
    let mut reader = InputStream::new(reader);

    let vec: (u32, u32, u32) = reader.read();
    assert_eq!(vec, (1, 2, 3));

    assert!(<u32>::try_read_from(&mut reader, Default::new()).is_err());
}

#[test]
fn read_tuple_5() {
    let reader = Cursor::new("1 2 3.0 false 1".as_bytes());
    let mut reader = InputStream::new(reader);

    let vec: (u32, char, f64, bool, NonZero<u32>) = reader.read();
    assert_eq!(vec, (1, '2', 3.0, false, 1.try_into().unwrap()));

    assert!(<char>::try_read_from(&mut reader, Default::new()).is_err());
}

#[test]
#[should_panic = "expect more characters before EOF"]
fn try_read_tuple_3_insufficient_err() {
    let reader = Cursor::new("1".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: (i32, i8, u32) = reader.read();
}

#[test]
#[should_panic = "stream did not contain valid UTF-8"]
fn try_read_tuple_3_encoding_err() {
    let reader = Cursor::new(b"1 \xff 3");
    let mut reader = InputStream::new(reader);

    let _: (i32, i8, u32) = reader.read();
}

#[test]
fn try_read_tuple_3_from_str_err() {
    let reader = Cursor::new("l m n".as_bytes());
    let mut reader = InputStream::new(reader);

    let vec: Result<(char, String, bool), _> = reader.try_read();
    let err = vec.unwrap_err();
    assert_eq!(err.to_string(), "error during converting a string \"n\" to a value of `bool`: provided string was not `true` or `false`");
    assert_eq!(
        format!("{:?}", err),
        "FromStrError(T3(ParseBoolError), \"n\", \"bool\")"
    );
}

#[test]
#[cfg_attr(
    feature = "c-compatible",
    should_panic = "found unexpected character at the end of the string \"-\" during converting it to a value of \"u32\""
)]
#[cfg_attr(
    not(feature = "c-compatible"),
    should_panic = "error during converting a string \"-3\" to a value of `u32`: invalid digit found in string"
)]
fn read_tuple_3_unexpected_char_err() {
    let reader = Cursor::new("1 2 -3".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: (u32, u32, u32) = reader.read();
}

#[test]
fn read_tuple_12() {
    let reader = Cursor::new("1 2 3 4 5 6 7 8 9 10 11 12".as_bytes());
    let mut reader = InputStream::new(reader);

    let vec: (u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32) = reader.read();
    assert_eq!(vec, (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12));

    assert!(<u32>::try_read_from(&mut reader, Default::new()).is_err());
}

#[test]
fn write() {
    let mut buf = Vec::new();
    let vec = (1, 2, 3);
    unwrap!(vec.try_write_into(&mut buf));
    assert_eq!(from_utf8(&buf).unwrap(), "1 2 3");

    buf.clear();
    let vec = (1,);
    unwrap!(vec.try_write_into(&mut buf));
    assert_eq!(from_utf8(&buf).unwrap(), "1");

    buf.clear();
    let vec = ((1, 2), (3, 4));
    unwrap!(vec.try_write_into(&mut buf));
    assert_eq!(from_utf8(&buf).unwrap(), "1 2\n3 4");

    buf.clear();
    let vec = ();
    unwrap!(vec.try_write_into(&mut buf));
    assert_eq!(from_utf8(&buf).unwrap(), "");

    buf.clear();
    let vec = ((1, 2, 3), (4, 5, 6), (7, 8, 9));
    unwrap!(vec.try_write_into(&mut buf));
    assert_eq!(from_utf8(&buf).unwrap(), "1 2 3\n4 5 6\n7 8 9");

    buf.clear();
    let vec = ((1, 2, 3), (4, 5, 6), (7, 8, 9));
    unwrap!(vec.try_write_into_with_sep(&mut buf, &[' '; 0]));
    assert_eq!(from_utf8(&buf).unwrap(), "1 2 3\n4 5 6\n7 8 9");

    buf.clear();
    let vec = ((1, 2, 3), (4, 5, 6), (7, 8, 9));
    unwrap!(vec.try_write_into_with_sep(&mut buf, ' '));
    assert_eq!(from_utf8(&buf).unwrap(), "1 2 3 4 5 6 7 8 9");
}

#[test]
fn show() {
    use std::str::from_utf8;
    let mut buf = Vec::new();
    buf.clear();
    show!((1, 2, 3) => buf);
    assert_eq!(unwrap!(from_utf8(&buf)), "1 2 3\n");

    buf.clear();
    show!(((1, 2), (3, 4)) => buf);
    assert_eq!(unwrap!(from_utf8(&buf)), "1 2\n3 4\n");

    buf.clear();
    show!(() => buf);
    assert_eq!(unwrap!(from_utf8(&buf)), "\n");

    buf.clear();
    show!(((1, 2, 3), (4, 5, 6), (7, 8, 9)) => buf);
    assert_eq!(unwrap!(from_utf8(&buf)), "1 2 3\n4 5 6\n7 8 9\n");

    buf.clear();
    show!(((1, 2, 3), (4, 5, 6), (7, 8, 9)) => buf);
    assert_eq!(unwrap!(from_utf8(&buf)), "1 2 3\n4 5 6\n7 8 9\n");
}