3 个不稳定版本
| 0.2.1 | 2023年12月24日 |
|---|---|
| 0.2.0 | 2023年11月5日 |
| 0.1.0 | 2021年8月8日 |
#175 in 编码
2,690 个月下载量
用于 21 个 crate (2 直接)
90KB
1.5K SLoC
keyvalues-serde
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(())
}
数据类型
支持
- 原始类型
booli8,i16,i32,i64,i128u8,u16,u32,u64,u128f32,f64char
StringOption- VDF 没有null类型的概念,因此可选值如果存在则被视为
Some,如果不存在则被视为None
- VDF 没有null类型的概念,因此可选值如果存在则被视为
- 单元变体枚举
- 表示为与变体名称匹配的文本
- Newtype 结构体
- 视为包含数据类型的包装器
- 同质序列(类似于
Vec的类型)- 表示为具有相同键的多个键值对
- 异质序列(类似于
tuple的类型)- 表示为具有相同键的多个键值对
- 元组结构体
- 视为包含元组的包装器
- 映射(类似于
HashMap的类型)- 表示为花括号
{}内的键值对列表
- 表示为花括号
- 结构体
- 与映射相同。结构体的名称在顶层键使用时除外则被忽略
不支持
| 类型 | 原因 |
|---|---|
| 字节数组 | 没有清晰的 VDF 表示 |
| 单元 | 没有清晰的 VDF 表示 |
| 单元结构体 | 没有清晰的 VDF 表示 |
| 枚举容器(newtype、元组和结构体变体) | 唯一明确的用法可能是未标记的表示形式,在这种情况下,类型的歧义(本质上都是字符串或对象)会导致太多陷阱,让我无法安心支持。 |
潜在风险
- 包含
Option的任何序列类型可能会由于None被省略而导致意外的排序问题。- 例如,中间包含
Option的元组将非常有问题。
- 例如,中间包含
- 序列化时,空的
Vec和包含None的Option都会被省略。 - 由于VDF(据我所知)序列的限制性本质,嵌套序列无法表示。
许可证
根据以下之一获得许可:
- Apache License,版本2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可 (LICENSE-MIT或https://open-source.org.cn/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义的,有意提交以包含在作品中的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~2.3–3MB
~63K SLoC