io-uring 0.3.2

The `io_uring` library for Rust.
Documentation
use std::io;
use io_uring::opcode::{ self, types };
use io_uring::{ squeue, IoUring };


const TEXT: &[u8] = b"hello world!";

pub fn do_write_read(ring: &mut IoUring, target: types::Target) -> anyhow::Result<()> {
    let buf = TEXT.to_vec();
    let mut buf2 = vec![0; TEXT.len() + 3];
    let bufs = [io::IoSlice::new(&buf)];
    let mut bufs2 = [io::IoSliceMut::new(&mut buf2)];

    let write_e = opcode::Writev::new(target, bufs.as_ptr() as *const _, 1);
    let read_e = opcode::Readv::new(target, bufs2.as_mut_ptr() as *mut _, 1);

    unsafe {
        let mut queue = ring.submission().available();
        queue.push(write_e.build().user_data(0x01).flags(squeue::Flags::IO_LINK))
            .ok()
            .expect("queue is full");
        queue.push(read_e.build().user_data(0x02))
            .ok()
            .expect("queue is full");
    }

    ring.submit_and_wait(2)?;

    let cqes = ring
        .completion()
        .available()
        .collect::<Vec<_>>();

    assert_eq!(cqes.len(), 2);
    assert_eq!(cqes[0].user_data(), 0x01);
    assert_eq!(cqes[1].user_data(), 0x02);
    assert_eq!(cqes[0].result(), 12);
    assert_eq!(cqes[1].result(), 12);

    assert_eq!(&buf2[..cqes[1].result() as usize], TEXT);

    Ok(())
}