keyvalues-serde

keyvalues-serde is a (de)serialization library for VDF text v1 and v2 built on the serde framework. This library leverages keyvalues-parser for parsing and rendering the keyvalues text. This makes it easy to deal with VDF text files using strongly typed Rust structures.

Installation

Note: this requires at least Rust 1.42.0

Just add the following to your Cargo.toml

toml [dependencies] keyvalues-serde = "0.1.0"

Usage

There is documentation available here and there are examples available in the examples directory

Quickstart

toml [dependencies] keyvalues-serde = "0.1.0" serde = { version = "1.0.0", features = ["derive"] }

```rust use keyvaluesserde::{fromstr, Result as VdfResult}; use serde::Deserialize;

// Contents take from my ~/.data/Steam/steam/games/PlatformMenu.vdf const VDFTEXT: &str = r##" // this file defines the contents of the platform menu "Platform" { "Menu" { "Games" { "dll" "steamui" "interface" "SteamUIGames001" "MenuName" "#SteamGames" "SteamApp" "1" } "Friends" { "dll" "bin/friendsui" "interface" "VGuiModuleTracker001" "MenuName" "#AppFriends" } "Servers" { "dll" "bin/serverbrowser" "interface" "VGuiModuleServerBrowser001" "MenuName" "#AppServers" } "Settings" { "dll" "steamui" "interface" "VGuiModuleSettings001" "MenuName" "#App_Settings" "SteamApp" "1" } } } "##;

[derive(Deserialize, Debug)]

struct Platform { #[serde(rename = "Menu")] menu: Menu, }

[derive(Deserialize, Debug)]

[serde(rename_all = "PascalCase")]

struct Menu { games: MenuModule, friends: MenuModule, servers: MenuModule, settings: MenuModule, }

[derive(Deserialize, Debug)]

struct MenuModule { dll: String, interface: String, #[serde(rename = "MenuName")] menuname: String, #[serde(rename = "SteamApp")] steamapp: Option, }

fn main() -> VdfResult<()> { let platform: Platform = fromstr(VDFTEXT)?; println!("{:#?}", platform);

Ok(())

} ```

Datatypes

Supported

Unsupported

| Type | Reasoning | | :---: | :--- | | Byte Array | No clear VDF representation | | Unit | No clear VDF representation | | Unit Struct | No clear VDF representation | | Enum-containers (newtype, tuple, and struct variants) | The only clear usage would be the untagged representation in which case the ambiguity of types (everything is essentially just strings or objects) allows for too many footguns for me to be comfortable supporting |

Potential Pitfalls

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.