kv-parser 0.2.0

A simple parser of key-value-files as hash maps
Documentation
  • Coverage
  • 100%
    6 out of 6 items documented1 out of 3 items with examples
  • Size
  • Source code size: 6.33 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 1.4 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Links
  • porky11/kv-parser
    0 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • porky11

Key Value Parser

A Rust library for parsing simple key-value text files into HashMap<Box<str>, Box<str>>.

Format

The parser reads text files where each non-empty line contains a key-value pair separated by whitespace:

  • Keys and values are separated by the first whitespace character on each line
  • Keys cannot contain whitespace
  • Values can contain any characters including whitespace (leading/trailing whitespace is trimmed)
  • Empty lines and lines without whitespace are ignored
  • Keys must be unique (duplicate keys result in an error)

Usage

Add to your Cargo.toml:

[dependencies]
kv-parser = "0.1.0"
use std::path::Path;

use kv_parser::{Error, file_to_key_value_map};

fn main() -> Result<(), Error> {
    let path = Path::new("savedata.sav");
    let save_data = file_to_key_value_map(path)?;

    if let Some(level) = save_data.get("current-level") {
        println!("Current level: {level}");
    }

    Ok(())
}

Error Handling

The function returns Result<HashMap<Box<str>, Box<str>>, Error> where Error can be:

  • Error::OpeningFile - Failed to open the file
  • Error::ReadingFile - I/O error while reading lines
  • Error::MultipleKeys(key) - Duplicate key found in file

Example

Given a file savedata.sav:

current-level vulcano
start-point 3
player-upgrades super-jump climbing lava-suit bombs

The parsed result:

use std::{collections::HashMap, path::Path};

use kv_parser::file_to_key_value_map;

let mut expected = HashMap::new();
expected.insert("current-level".into(), "vulcano".into());
expected.insert("start-point".into(), "3".into());
expected.insert(
    "player-upgrades".into(),
    "super-jump climbing lava-suit bombs".into(),
);

let result = file_to_key_value_map(Path::new("savedata.sav"))?;
assert_eq!(expected, result);

Performance

  • Uses Box<str> instead of String for reduced memory overhead
  • Efficient line-by-line reading with BufReader
  • Early termination on duplicate keys or I/O errors