4个版本 (破坏性更新)

0.4.0 2023年5月20日
0.3.0 2022年7月2日
0.2.0 2022年4月30日
0.1.0 2022年4月30日

#795 in 编码

每月34次下载

MIT/Apache

1MB
23K SLoC

msd

GitHub Workflow Status codecov.io crates.io docs.rs MSRV License

用于读取和写入MSD文件的库。

用法

使用serde库读取和写入MSD文件,该库用于通用序列化和反序列化。它将与实现SerializeDeserialize特质的任何类型一起工作。

示例

use std::collections::HashMap;

fn main() {
    let mut map: HashMap<String, usize> = HashMap::new();
    map.insert("foo".to_owned(), 1);
    map.insert("bar".to_owned(), 2);

    // Serialize the map into a byte buffer.
    let serialized = msd::to_bytes(&map).unwrap();

    // Deserialize back into a map again.
    let deserialized = msd::from_bytes(&serialized).unwrap();

    assert_eq!(map, deserialized); 
}

无法表示的类型

并非所有的serde类型都可以在MSD格式中表示。由于解码时可能出现的歧义,一些复合类型无法编码。具体来说,以下不可表示的serde类型是

  • tupletuple_struct包含option
  • tupletuple_struct包含seq
  • tupletuple_struct包含map
  • tupletuple_struct包含struct
  • struct包含另一个struct作为字段值。
  • seq包含option
  • seq包含另一个seq作为元素。

此外,此库无法反序列化旨在作为自描述类型进行反序列化的类型,并且结构体字段和枚举变体都必须以标识符的形式进行反序列化。有关更多详细信息,请参阅serdeDeserializer文档

关于MSD文件

MSD是一种自90年代末以来一直在使用的配置文件格式。它主要用于节奏舞蹈游戏,如StepmaniaDancing With Intensity,但它在许多其他环境中也适用。MSD文件的优点是可读性和易于修改。

格式

虽然MSD文件格式从未被正式指定,但该格式被非正式定义为以下格式的任意数量的标签与可选数量的参数配对:#TAG:PARAM0:PARAM1:PARAM2;。标签和参数可以是任意字节序列,但要求:;#\字节是转义过的。

可以使用前缀//来添加注释。任何不打算创建注释的//对都应该被转义。请注意,虽然这个库可以解析带有注释的MSD文件,但它不能写入注释。

MSD的一些非正式用法允许单个标签有多个参数列表,最值得注意的是Dancing With Intensity的.dwi文件(该文件使用MSD格式编写)的#BACKGROUND标签。这个库也配备了读取和写入这些类型标签的功能,将它们解释为serde映射数据类型。

起源

MSD格式的首次已知使用来自节奏舞蹈游戏DDR'99(DDR在这里代表“Delight Delight Reduplication”)。已知最早的.msd文件规范是版本2.0β1。请注意,.msd文件不一定与通常所说的“MSD文件”相同;.msd文件通常包含特定的标签,而“MSD文件”是任何遵循MSD标签-参数结构的文件(参见Stepmania对MSD文件的定义)。

至于MSD最初代表什么,没有人确切知道。最有可能的猜测是“Musical Score Data”,但没有确凿的来源支持这一点。现代对该格式的使用简单地将其称为“MSD”。

最低支持的Rust版本

这个crate保证可以在稳定版rustc 1.58.0及以上编译。

许可证

该项目根据您的选择,许可为以下之一:

at your option.

贡献

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

依赖项

~340–690KB
~14K SLoC