#serde #vdf #json #format #parser #valve

vdf-serde

支持 Serde 的 Valve 数据格式

3 个版本 (重大更新)

0.3.0 2020 年 8 月 31 日
0.2.0 2020 年 8 月 31 日
0.1.0 2020 年 8 月 31 日

#2114 in 编码

Download history 121/week @ 2024-03-29 81/week @ 2024-04-05 71/week @ 2024-04-12 106/week @ 2024-04-19 75/week @ 2024-04-26 62/week @ 2024-05-03 111/week @ 2024-05-10 78/week @ 2024-05-17 28/week @ 2024-05-24 136/week @ 2024-05-31 288/week @ 2024-06-07 183/week @ 2024-06-14 171/week @ 2024-06-21 30/week @ 2024-06-28 115/week @ 2024-07-05 97/week @ 2024-07-12

每月下载 448
用于 4 个crate

MIT/Apache

32KB
598

vdf-serde

builds.sr.ht status Crates.io version Crates.io downloads Crates.io license

Valve 数据格式 提供对 Serde 的支持。

基于 steamy-vdf VDF 解析库。

使用方法

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

[dependencies]
vdf-serde = "0.3.0"

简单示例

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Example {
    thing: String,
    other_thing: bool,
    more_stuff: Inner,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Inner {
    bonus_content: u8,
    coolness: f64,
}

let vdf_data = "\"Example\"
{
\t\"thing\"\t\"hello\"
\t\"other_thing\"\t\"1\"
\t\"more_stuff\"
\t{
\t\t\"bonus_content\"\t\"69\"
\t\t\"coolness\"\t\"420.1337\"
\t}
}";
let data = Example {
    thing: "hello".to_string(),
    other_thing: true,
    more_stuff: Inner {
        bonus_content: 69,
        coolness: 420.1337,
    },
};

assert_eq!(vdf_serde::to_string(&data)?, vdf_data);
assert_eq!(vdf_serde::from_str::<Example>(vdf_data)?, data);

说明

由于 VDF 格式定义得相当不明确,因此在我找到一种兼容现有 VDF 文件的方法之前,以下来自 Serde 数据模型 的类型不受支持

  • 字节数组
  • 可选
  • 单元 ()
  • 单元结构 struct WillNotWork;
  • 新类型变体 enum Broken { Example(u8) }
  • 序列 Vec<T>
  • 元组
  • 元组结构 struct Unsupported(u8, bool, char);
  • 元组变体 enum Bad { NotWorking(u8, bool, char) }
  • 结构变体 enum Nope { NotHappening { datum: u8 } }

如果您使用此类功能,可能需要自己实现 SerializeDeserialize。尽管如此,Serde 数据模型的其余部分仍然正常工作,尽管使用非原子键的映射可能会有些混乱。

use std::collections::HashMap as Map;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
enum UnitVariants { A, B }
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct NewtypeStruct(u8);
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct KitchenSink {
    a: bool,
    b: i8,
    c: i16,
    d: i32,
    e: i64,
    f: u8,
    g: u16,
    h: u32,
    i: u64,
    j: f32,
    k: f64,
    l: char,
    m: String,
    n: UnitVariants,
    o: NewtypeStruct,
    p: Map<String, String>,
}

let data = KitchenSink { // yada yada yada
};
assert_eq!(data, vdf_serde::from_str(&vdf_serde::to_string(&data)?)?);

许可证

根据以下任一许可证授权:

由您选择。

贡献

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

历史

v0.3.0 - 2020-08-31

  • 使用顶级 newtype 附带的名称

v0.2.0 - 2020-08-31

  • 更有用的错误
  • 如果反序列化后的文本全部为空白,则不报错

v0.1.0 - 2020-08-31

  • 首次发布

依赖项

~1–1.7MB
~37K SLoC