runnel is the pluggable io stream. now support: stdio, string io, in memory pipe.
Example of stdio : ```rust use runnel::medium::stdio::{StdErr, StdIn, StdOut}; use runnel::StreamIoe;
let sioe = StreamIoe { pin: Box::new(StdIn::default()), pout: Box::new(StdOut::default()), perr: Box::new(StdErr::default()), }; ```
Example of stringio : ```rust use runnel::StreamIoe; use runnel::medium::stringio::{StringErr, StringIn, StringOut}; use std::io::{BufRead, Write};
let sioe = StreamIoe { pin: Box::new(StringIn::with_str("ABCDE\nefgh\n")), pout: Box::new(StringOut::default()), perr: Box::new(StringErr::default()), };
// pluggable stream in let mut linesiter = sioe.pin.lock().lines().map(|l| l.unwrap()); asserteq!(linesiter.next(), Some(String::from("ABCDE"))); asserteq!(linesiter.next(), Some(String::from("efgh"))); asserteq!(lines_iter.next(), None);
// pluggable stream out
let res = sioe.pout.lock() .writefmt(formatargs!("{}\nACBDE\nefgh\n", 1234)); assert!(res.isok()); asserteq!(sioe.pout.lock().buffer_str(), "1234\nACBDE\nefgh\n");
// pluggable stream err
let res = sioe.perr.lock() .writefmt(formatargs!("{}\nACBDE\nefgh\n", 1234)); assert!(res.isok()); asserteq!(sioe.perr.lock().buffer_str(), "1234\nACBDE\nefgh\n"); ```
Example of pipeio : ```rust use runnel::medium::pipeio::pipe; use runnel::medium::stringio::{StringErr, StringIn, StringOut}; use runnel::StreamIoe; use std::io::{BufRead, Write};
// create in memory pipe let (aout, ain) = pipe(1);
// a working thread let sioe = StreamIoe { pin: Box::new(StringIn::withstr("ABCDE\nefgh\n")), pout: Box::new(aout), // pluggable pipe out perr: Box::new(StringErr::default()), }; let handler = std::thread::spawn(move || { for line in sioe.pin.lock().lines().map(|l| l.unwrap()) { let mut out = sioe.pout.lock(); out.writefmt(formatargs!("{}\n", line)).unwrap(); out.flush().unwrap(); } });
// a main thread let sioe = StreamIoe { pin: Box::new(ain), // pluggable pipe in pout: Box::new(StringOut::default()), perr: Box::new(StringErr::default()), }; let mut linesiter = sioe.pin.lock().lines().map(|l| l.unwrap()); asserteq!(linesiter.next(), Some(String::from("ABCDE"))); asserteq!(linesiter.next(), Some(String::from("efgh"))); asserteq!(linesiter.next(), None);
assert!(handler.join().is_ok()); ```