io-window

Crates.ioio-window
lib.rsio-window
version1.0.0
sourcesrc
created_at2024-09-12 14:23:53.327986
updated_at2024-09-12 14:23:53.327986
descriptionSeekable I/O adapter that limits operations to a byte range
homepage
repositoryhttps://github.com/iliana/io-window
max_upload_size
id1372822
size31,466
iliana etaoin (iliana)

documentation

README

io-window

This library contains IoWindow, an I/O adapter for a stream of bytes that limits operations within a byte range.

An IoWindow is conceptually similar to a mutable slice, applied to a reader or writer. Given a byte range start..end, position 0 of the IoWindow is position start of the underlying object; the end position of the IoWindow is position start + end of the underlying object; and the length of the IoWindow is end - start.

use io_window::IoWindow;

let stream = std::io::Cursor::new([0; 8]);
let mut window = IoWindow::new(stream, 2..6)?;
assert_eq!(window.write(&[42; 16])?, 4);
assert_eq!(
    window.into_inner().into_inner(),
    [0, 0, 42, 42, 42, 42, 0, 0]
);

One use of this library is operating within a partition of a disk image. For instance, if you have a filesystem implementation that uses a Read + Write + Seek object, you can use IoWindow to avoid needing to copy a disk image's partition into memory or another file, or reaching for a memory-mapped buffer.

const MEBIBYTE: u64 = 1024 * 1024;

let file = File::open(disk)?;
let mut partition = IoWindow::new(file, MEBIBYTE..(64 * MEBIBYTE))?;

It's also possible to provide a range with an unbounded end. If you were working with a file with a header that you needed the ability to modify and append to, you could use a range like 1024.. to create an IoWindow from position 1024 to the end of the file.

License: MPL-2.0

Commit count: 0

cargo fmt