12 releases (7 breaking)

new 0.8.1 Nov 23, 2024
0.7.2 Oct 31, 2024

#316 in Encoding

Download history 423/week @ 2024-09-28 324/week @ 2024-10-05 122/week @ 2024-10-12 11/week @ 2024-10-19 305/week @ 2024-10-26 69/week @ 2024-11-02 125/week @ 2024-11-09 40/week @ 2024-11-16

540 downloads per month
Used in 5 crates

MIT license

190KB
2.5K SLoC

Crates.io Version GitHub Issues or Pull Requests GitHub Actions Workflow Status

dh

Data handling in Rust, made easy.

Features

  • Read and write files in streams
  • No unsafe code
  • Support for a lot of data types (including variable length integers and custom length integers)
  • Read and write u8 vectors
  • std::io::Read and std::io::Write implementations for Readable and Writable (happens automatically as they extend these traits)
  • Copying data from a Readable to a Writable
  • Partial read & write access

Planned features

  • Floating point number support
  • Zero-cost cloning
  • Zero-cost subarray clones
  • Reading and writing of data that does not fill a whole byte

Installation

cargo add dh

Documentation

The documentation can be found on docs.rs.

Usage

Simple file reading

use dh::recommended::*;

fn main() {
    let mut file = dh::file::open_r("data.txt").unwrap();
    let size = file.size().unwrap();
    assert_eq!(file.read_utf8(size).unwrap(), "Hello, world!\n");
}

Simple file writing

use dh::recommended::*;

fn main() {
    let mut file = dh::file::open_w("data.txt").unwrap();
    file.write_utf8_at("Hello, world!\n", 0).unwrap();
    file.close().unwrap(); // optional, but recommended
}

Open a file in read/write mode

use dh::recommended::*;

fn main() {
    let mut file = dh::file::open_rw("data.txt").unwrap();
    file.write_utf8_at("Hello, world!\n", 0).unwrap();
    file.rewind().unwrap();
    let size = file.size().unwrap();
    assert_eq!(file.read_utf8(size).unwrap(), "Hello, world!\n");
}

Read and write u8 vectors

Immutable borrowing
use dh::recommended::*;

fn main() {
    let mut data = vec![31u8; 1];
    let mut rw = dh::data::read_ref(&data);
    assert_eq!(rw.read_u8().unwrap(), 31);
}
Mutable borrowing
use dh::recommended::*;

fn main() {
    let mut data = vec![0u8; 1];
    let mut rw = dh::data::rw_ref(&mut data);
    rw.write_u8(31).unwrap();
    rw.rewind().unwrap();
    assert_eq!(rw.read_u8().unwrap(), 31);
}

Alternative: moving

use dh::recommended::*;

fn main() {
    let data = vec![0u8; 1];
    let mut rw = dh::data::rw(data);
    rw.write_u8(31).unwrap();
    rw.rewind().unwrap();
    assert_eq!(rw.read_u8().unwrap(), 31);

    let data = dh::data::close(rw).unwrap();
    assert_eq!(data, vec![31]);
}

Limit readable space

use dh::recommended::*;

fn main() {
    let mut file = dh::file::open_r("data.txt").unwrap();
    let mut limited = file.limit(0, 5).unwrap();
    assert_eq!(limited.read_utf8(5).unwrap(), "Hello");
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

No runtime deps