keyvalues-parser

Crates.iokeyvalues-parser
lib.rskeyvalues-parser
version0.2.0
sourcesrc
created_at2021-08-08 21:40:52.218954
updated_at2023-11-05 21:00:07.16367
descriptionA parser/renderer for vdf text
homepagehttps://github.com/CosmicHorrorDev/vdf-rs
repositoryhttps://github.com/CosmicHorrorDev/vdf-rs
max_upload_size
id433353
size79,965
CosmicHorror (CosmicHorrorDev)

documentation

README

keyvalues-parser

codecov build status Documentation

keyvalues-parser uses pest to parse VDF text v1 files to an untyped Rust structure to ease manipulation and navigation. The parser provides an untyped Vdf representation as well as a linear TokenStream

The library is primarily used in conjunction with keyvalues-serde which provides a more ergonomic (yet more limiting) means of dealing with VDF text.

Installation

Just add the library to your Cargo.toml

[dependencies]
keyvalues-parser = "0.1.0"

Quickstart

const LOGIN_USERS_VDF: &str = r#"
"users"
{
    "12345678901234567"
    {
        "AccountName"        "ACCOUNT_NAME"
        "PersonaName"        "PERSONA_NAME"
        "RememberPassword"    "1"
        "MostRecent"        "1"
        "Timestamp"        "1234567890"
    }
}
"#;

use keyvalues_parser::Vdf;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let vdf = Vdf::parse(LOGIN_USERS_VDF)?;
    assert_eq!(
        "12345678901234567",
	vdf.value.unwrap_obj().keys().next().unwrap(),
    );

    Ok(())
}

Limitations

VDF text is drastically underspecified. This leads to the following liberties being taken

  • Not respecting the ordering of key-value pairs, where the pairs are stored in a BTreeMap that sorts the values based on the key
  • Because of limitations in representing sequences, an empty Vec of values will be rendered as a missing keyvalue pair

Benchmarks

A set of basic benchmarks can be found in the benches directory

These just test timing and throughput for both parsing and rendering of a fairly typical VDF file

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Commit count: 298

cargo fmt