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(())
}
数据类型
支持
- 原始类型
bool
i8
,i16
,i32
,i64
,i128
u8
,u16
,u32
,u64
,u128
f32
,f64
char
String
Option
- 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或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可 (LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义的,有意提交以包含在作品中的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~2.3–3MB
~63K SLoC