#vdf #key-value #deserialize #steam #serde

keyvalues-serde

(De)serialize VDF 文本与 serde

3 个不稳定版本

0.2.1 2023年12月24日
0.2.0 2023年11月5日
0.1.0 2021年8月8日

#175 in 编码

Download history 728/week @ 2024-03-14 651/week @ 2024-03-21 704/week @ 2024-03-28 548/week @ 2024-04-04 665/week @ 2024-04-11 495/week @ 2024-04-18 966/week @ 2024-04-25 500/week @ 2024-05-02 529/week @ 2024-05-09 503/week @ 2024-05-16 348/week @ 2024-05-23 458/week @ 2024-05-30 772/week @ 2024-06-06 704/week @ 2024-06-13 491/week @ 2024-06-20 672/week @ 2024-06-27

2,690 个月下载量
用于 21 个 crate (2 直接)

MIT/Apache

90KB
1.5K SLoC

keyvalues-serde

codecov build status Documentation

keyvalues-serde 是一个基于 VDF 文本 v1 的 (反) 序列化库,构建在 serde 框架之上。该库利用 keyvalues-parser 进行解析和渲染 keyvalues 文本,使得使用强类型 Rust 结构处理 VDF 文本文件变得容易。

安装

只需将以下内容添加到您的 Cargo.toml

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

快速入门

use serde::Deserialize;

// Contents take from my ~/.data/Steam/steam/games/PlatformMenu.vdf
const VDF_TEXT: &str = r##"
// this file defines the contents of the platform menu
"Platform"
{
    "Menu"
    {
        "Games"
        {
            "dll"       "steamui"
            "interface" "SteamUIGames001"
            "MenuName"  "#Steam_Games"
            "SteamApp"  "1"
        }
        "Friends"
        {
            "dll"       "bin/friendsui"
            "interface" "VGuiModuleTracker001"
            "MenuName"  "#App_Friends"
        }
        "Servers"
        {
            "dll"       "bin/serverbrowser"
            "interface" "VGuiModuleServerBrowser001"
            "MenuName"  "#App_Servers"
        }
        "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")]
    menu_name: String,
    #[serde(rename = "SteamApp")]
    steam_app: Option<bool>,
}

fn main() -> keyvalues_serde::Result<()> {
    let platform: Platform = keyvalues_serde::from_str(VDF_TEXT)?;
    println!("{:#?}", platform);

    Ok(())
}

数据类型

支持

  • 原始类型
    • bool
    • i8, i16, i32, i64, i128
    • u8, u16, u32, u64, u128
    • f32, f64
    • char
  • String
  • Option
    • VDF 没有null类型的概念,因此可选值如果存在则被视为 Some,如果不存在则被视为 None
  • 单元变体枚举
    • 表示为与变体名称匹配的文本
  • Newtype 结构体
    • 视为包含数据类型的包装器
  • 同质序列(类似于 Vec 的类型)
    • 表示为具有相同键的多个键值对
  • 异质序列(类似于 tuple 的类型)
    • 表示为具有相同键的多个键值对
  • 元组结构体
    • 视为包含元组的包装器
  • 映射(类似于 HashMap 的类型)
    • 表示为花括号 {} 内的键值对列表
  • 结构体
    • 与映射相同。结构体的名称在顶层键使用时除外则被忽略

不支持

类型 原因
字节数组 没有清晰的 VDF 表示
单元 没有清晰的 VDF 表示
单元结构体 没有清晰的 VDF 表示
枚举容器(newtype、元组和结构体变体) 唯一明确的用法可能是未标记的表示形式,在这种情况下,类型的歧义(本质上都是字符串或对象)会导致太多陷阱,让我无法安心支持。

潜在风险

  • 包含Option的任何序列类型可能会由于None被省略而导致意外的排序问题。
    • 例如,中间包含Option的元组将非常有问题。
  • 序列化时,空的Vec和包含NoneOption都会被省略。
  • 由于VDF(据我所知)序列的限制性本质,嵌套序列无法表示。

许可证

根据以下之一获得许可:

任选其一。

贡献

除非您明确声明,否则您根据Apache-2.0许可证定义的,有意提交以包含在作品中的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~2.3–3MB
~63K SLoC