#pipe #fifo #filter #threads

runnel

the pluggable io stream. now support: stdio, string io, in memory pipe

17 releases

Uses new Rust 2021

0.3.11 Jun 13, 2022
0.3.9 Nov 14, 2021
0.3.7 Jun 24, 2021
0.3.4 Mar 8, 2021

#36 in Concurrency

Download history 18/week @ 2022-04-20 132/week @ 2022-04-27 116/week @ 2022-05-04 250/week @ 2022-05-11 115/week @ 2022-05-18 104/week @ 2022-05-25 166/week @ 2022-06-01 61/week @ 2022-06-08 96/week @ 2022-06-15 88/week @ 2022-06-22 53/week @ 2022-06-29 20/week @ 2022-07-06 54/week @ 2022-07-13 69/week @ 2022-07-20 65/week @ 2022-07-27 67/week @ 2022-08-03

259 downloads per month
Used in fewer than 12 crates

MIT/Apache

44KB
1K SLoC

runnel

The pluggable io stream. now support: stdio, string io, in memory pipe.

Features

  • support common operation: stdin, stdout, stderr, stringin, stringout, pipein and pipeout.
  • thin interface
  • support testing stream io
  • minimum support rustc 1.56.1 (59eed8a2a 2021-11-01)

Examples

Example of stdio :

use runnel::RunnelIoeBuilder;
let sioe = RunnelIoeBuilder::new().build();

Example of stringio :

use runnel::RunnelIoeBuilder;
use std::io::{BufRead, Write};

let sioe = RunnelIoeBuilder::new()
    .fill_stringio_with_str("ABCDE\nefgh\n")
    .build();

// pluggable stream in
let mut lines_iter = sioe.pin().lock().lines().map(|l| l.unwrap());
assert_eq!(lines_iter.next(), Some(String::from("ABCDE")));
assert_eq!(lines_iter.next(), Some(String::from("efgh")));
assert_eq!(lines_iter.next(), None);

// pluggable stream out
#[rustfmt::skip]
let res = sioe.pout().lock()
    .write_fmt(format_args!("{}\nACBDE\nefgh\n", 1234));
assert!(res.is_ok());
assert_eq!(sioe.pout().lock().buffer_str(), "1234\nACBDE\nefgh\n");

// pluggable stream err
#[rustfmt::skip]
let res = sioe.perr().lock()
    .write_fmt(format_args!("{}\nACBDE\nefgh\n", 1234));
assert!(res.is_ok());
assert_eq!(sioe.perr().lock().buffer_str(), "1234\nACBDE\nefgh\n");

Example of pipeio :

use runnel::RunnelIoeBuilder;
use runnel::medium::pipeio::pipe;
use std::io::{BufRead, Write};

// create in memory pipe
let (a_out, a_in) = pipe(1);

// a working thread
let sioe = RunnelIoeBuilder::new()
    .fill_stringio_with_str("ABCDE\nefgh\n")
    .pout(a_out)    // pluggable pipe out
    .build();
let handler = std::thread::spawn(move || {
    for line in sioe.pin().lock().lines().map(|l| l.unwrap()) {
        let mut out = sioe.pout().lock();
        let _ = out.write_fmt(format_args!("{}\n", line));
        let _ = out.flush();
    }
});

// a main thread
let sioe = RunnelIoeBuilder::new()
    .fill_stringio_with_str("ABCDE\nefgh\n")
    .pin(a_in)      // pluggable pipe in
    .build();
let mut lines_iter = sioe.pin().lock().lines().map(|l| l.unwrap());
assert_eq!(lines_iter.next(), Some(String::from("ABCDE")));
assert_eq!(lines_iter.next(), Some(String::from("efgh")));
assert_eq!(lines_iter.next(), None);

assert!(handler.join().is_ok());

Changelogs

This crate's changelog here.

License

This project is licensed under either of

at your option.

No runtime deps