12 个版本
0.4.8 | 2022 年 8 月 10 日 |
---|---|
0.4.7 | 2021 年 3 月 8 日 |
0.4.5 |
|
0.4.3 | 2020 年 8 月 24 日 |
0.1.0 | 2020 年 6 月 8 日 |
在 解析器实现 中排名 797
每月下载量 35 次
71KB
1.5K SLoC
listinfo-rs
零拷贝的 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