Skip to content

pimalaya/stream

Repository files navigation

Stream flows Documentation Matrix

I/O-free Rust library to read from and write into streams.

Design

This library does not perform I/O the usual way. It relies instead on 3 concepts:

Flow

The flow is an I/O-free, composable and iterable state machine that emits I/O requests. A flow is considered terminated when it does not emit I/O requests anymore.

Handler

The I/O handler contains all the I/O logic, and is responsible for processing I/O requests. It takes input from the flow, performs I/O, then puts the output back inside the flow.

See available handlers at ./src/handlers.

Loop

The loop is the glue between the flow and the I/O handler. It makes the flow progress while allowing handlers to process I/O.

Examples

See complete examples at ./examples.

Read stdin synchronously

use stream_flows::State;
use stream_std::Handle;

let mut stdin = std::io::stdin();
let mut state = State::default();

let n = Handler::read(&mut tcp, &mut state).unwrap();
let input = String::from_utf8_lossy(state.get_read_bytes(n));

Write TCP stream synchronously

use stream_flows::State;
use stream_std::Handler;

let mut tcp = std::net::TcpStream::connect("127.0.0.1:1234").unwrap();
let mut state = State::default();
state.enqueue_bytes(b"data");

Handler::write(&mut tcp, &mut state).unwrap();

More

Have a look at bigger projects built on the top of stream flows:

Sponsoring

nlnet

Special thanks to the NLnet foundation and the European Commission that helped the project to receive financial support from various programs:

If you appreciate the project, feel free to donate using one of the following providers:

GitHub Ko-fi Buy Me a Coffee Liberapay thanks.dev PayPal