#dat #parse #mame #parser #user-friendly #version-string #clrmamepro

无 std listinfo

零拷贝的 MAME ListInfo 格式 DAT 文件解析器和反序列化器

12 个版本

0.4.8 2022 年 8 月 10 日
0.4.7 2021 年 3 月 8 日
0.4.5 2021 年 2 月 14 日
0.4.3 2020 年 8 月 24 日
0.1.0 2020 年 6 月 8 日

解析器实现 中排名 797

每月下载量 35

MIT 许可协议 MIT

71KB
1.5K SLoC

listinfo-rs

Latest Version Docs License

零拷贝的 MAME ListInfo 格式 DAT 文件解析器。


用法

listinfo-rs 提供了更底层的零拷贝表达式树 API 以及更用户友好的 Serde 反序列化 API。有关更多示例,请参阅 crate 文档或测试。

#[test]
fn parse_cave_story() {
    const CAVE_STORY: &str =
     r#"clrmamepro (
        name "Cave Story"
        description "Cave Story"
        version 20161204
        comment "libretro | www.libretro.com"
    )"#;

    let document = parse::parse_document(CAVE_STORY).unwrap();
    let header = document.entry("clrmamepro").unwrap().next().unwrap();
    let game = document.entry("game").unwrap().next().unwrap();
    let rom = game.entry_unique("rom").unwrap();
    assert_eq!(
        header.entry_unique("name"),
        Some(&EntryData::Scalar("Cave Story"))
    );
}

Serde 反序列化

listinfo-rs 支持在 Cargo.toml 中启用支持后使用 serde 进行反序列化。

listinfo = { version = "0.4", features = ["deserialize"] }

反序列化工作方式与任何其他 Serde 反序列化 crate 相同。

use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct Header {
    name: String,
    description: String,
    version: String,
    comment: String,
}

#[derive(Debug, Deserialize)]
struct Game {
    name: String,
    releaseyear: u32,
    developer: String,
    rom: Vec<Rom>,
}

#[derive(Debug, Deserialize)]
struct Rom {
    name: String,
    size: u64,
    // Supports serialize hex strings to byte arrays
    #[serde(with = "serde_bytes")]
    crc: Vec<u8>,
    #[serde(with = "serde_bytes")]
    md5: Vec<u8>,
    #[serde(with = "serde_bytes")]
    sha1: Vec<u8>,
}

#[derive(Debug, Deserialize)]
struct CaveStory {
    clrmamepro: Header,
    game: Vec<Game>,
}

#[test]
fn deserialize_cave_story() {
    const CAVE_STORY: &str = r#"clrmamepro (
                name "Cave Story"
                description "Cave Story"
                version 20161204
                comment "libretro | www.libretro.com"
            )
            game (
                name "Cave Story (En)"
                description "Cave Story (En)"
                developer "Studio Pixel"
                releaseyear "2004"
                rom ( 
                    name "Doukutsu.exe"
                    size 1478656 
                    crc c5a2a3f6 
                    md5 38695d3d69d7a0ada8178072dad4c58b 
                    sha1 bb2d0441e073da9c584f23c2ad8c7ab8aac293bf
                )
            )
        "#;

    let cave_story = listinfo::de::from_str::<CaveStory>(CAVE_STORY).unwrap();
    assert_eq!(cave_story.clrmamepro.name, "Cave Story");
    assert_eq!(cave_story.game.first().unwrap().rom.first().unwrap().name, "Doukutsu.exe");
    assert_eq!(cave_story.game.first().unwrap().rom.first().unwrap().size, 1478656);
    assert_eq!(cave_story.game.first().unwrap().rom.first().unwrap().crc, &[0xc5, 0xa2, 0xa3, 0xf6]);
}

无 std

listinfo-rs 支持 no_std,但需要 alloc

您可以在 Cargo.toml 中禁用 std 支持。

listinfo = { version = "0.4", default-features = false }

依赖项

约 2.5MB
约 40K SLoC