#async-io #pattern #future #io #async #io-read #io-operations

handy_async

一个用于声明式描述异步代码的便捷库

14个版本

使用旧的Rust 2015

0.2.13 2017年11月8日
0.2.12 2017年8月27日
0.2.11 2017年3月17日
0.2.9 2017年2月22日
0.2.5 2016年12月18日

#832异步

Download history 60/week @ 2024-04-01 28/week @ 2024-04-08 49/week @ 2024-04-15 43/week @ 2024-04-22 34/week @ 2024-04-29 27/week @ 2024-05-06 23/week @ 2024-05-13 35/week @ 2024-05-20 26/week @ 2024-05-27 25/week @ 2024-06-03 38/week @ 2024-06-10 27/week @ 2024-06-17 37/week @ 2024-06-24 11/week @ 2024-07-08 49/week @ 2024-07-15

99 每月下载量
4 个crate(3个直接)中使用

MIT 许可证

180KB
4K SLoC

handy_async

Documentation Build Status License: MIT

此库提供了一些功能,帮助Rust中的异步操作。

文档

handy_async 使用 futures 来实现异步操作(主要是I/O相关操作)并定义了许多模式对象,以方便编写声明式代码。

例如,您可以编写一个异步读取在 RFC-793 中定义的TCP头部的函数,如下所示。

extern crate handy_async;
extern crate futures;

use std::io::{Read, Error};
use futures::{Future, BoxFuture};
use handy_async::io::ReadFrom;
use handy_async::pattern::{Pattern, Endian};
use handy_async::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).map_err(|e| e.into_error()).boxed()
}

安装

将以下行添加到您的 Cargo.toml

[dependencies]
handy_async = "0.2"

依赖关系

~175KB