#futures #async #io #pattern

handy_io

A handy pattern and futures based asynchronous I/O library

3 releases

Uses old Rust 2015

0.1.2 Nov 29, 2016
0.1.1 Nov 29, 2016
0.1.0 Nov 27, 2016

#1144 in Asynchronous

Download history 18/week @ 2023-06-01 21/week @ 2023-06-08 25/week @ 2023-06-15 24/week @ 2023-06-22 27/week @ 2023-06-29 23/week @ 2023-07-06 22/week @ 2023-07-13 22/week @ 2023-07-20 23/week @ 2023-07-27 22/week @ 2023-08-03 22/week @ 2023-08-10 25/week @ 2023-08-17 24/week @ 2023-08-24 22/week @ 2023-08-31 31/week @ 2023-09-07 22/week @ 2023-09-14

103 downloads per month

MIT license

110KB
2K SLoC

handy_io

Crates.io: handy_io Build Status License: MIT

This library provides miscellaneous functionalities to help I / O operations in Rust.

handy_io uses futures to achieve asynchronous I/O and defines a lot of pattern objects to facilitate writing I/O related codes declaratively.

For example, you can write a function to read a TCP header defined in RFC-793 asynchronously as following.

extern crate handy_io;
extern crate futures;

use std::io::{Read, Error};
use futures::{Future, BoxFuture};
use handy_io::io::ReadFrom;
use handy_io::pattern::{Pattern, Endian};
use handy_io::pattern::read::{U16, U32};

struct TcpHeader {
    source_port: u16,
    destination_port: u16,
    sequence_number: u32,
    acknowledgment_number: u32,
    data_offset: u8, // 4 bits
    reserved: u8, // 6 bits
    flags: u8, // 6 bits
    window: u16,
    checksum: u16,
    urgent_pointer: u16,
    option: Vec<u8>,
}

fn read_tcp_header<R: Read + Send + 'static>(reader: R) -> BoxFuture<TcpHeader, Error> {
    let pattern = (U16.be(), U16.be(), U32.be(), U32.be(), U16.be(), U16.be(), U16.be(), U16.be())
        .and_then(|(src_port, dst_port, seq_num, ack_num, flags, window, checksum, urgent)| {
            let data_offset = (flags & 0b1111) as u8;
            let header = TcpHeader {
                source_port: src_port,
                destination_port: dst_port,
                sequence_number: seq_num,
                acknowledgment_number: ack_num,
                data_offset: data_offset,
                reserved: ((flags >> 4) & 0b111111) as u8,
                flags: (flags >> 10) as u8,
                window: window,
                checksum: checksum,
                urgent_pointer: urgent,
                option: Vec::new(),
            };

            let option_size = (data_offset as usize - 5) * 4;
            (Ok(header), vec![0; option_size]) // Reads additional option bytes
        })
        .map(|(mut header, option)| {
            header.option = option;
            header
        });
    pattern.read_from(reader).map(|(reader, header)| header).boxed()
}

Documentation

See here.

The documentation includes some examples.

Installation

Add following lines to your Cargo.toml:

[dependencies]
handy_io = "0.1"

Dependencies

~215KB