3 个版本 (破坏性更新)
0.3.0 | 2023年11月17日 |
---|---|
0.2.0 | 2022年2月6日 |
0.1.0 | 2022年2月3日 |
#250 in 编程语言
35KB
583 行
ControlMap 序列化/反序列化库
Skyrim的controlmap.txt解析器。
目录
功能
-
controlmap.txt
=>json
-
json
=>controlmap.txt
(格式化并保留注释) - 使用枚举scanCodes进行分析。
示例
- 先决条件
[dependencies]
controlmap_parser = "*"
serde_json = "1.0" # Json converter
use controlmap_parser::ControlMap;
type Result<T, E = Box<dyn std::error::Error + 'static>> = core::result::Result<T, E>;
fn main() -> Result<()> {
let input = r#"
// Lockpicking
RotatePick 0xff 0xa 0x000b 0 0 0 0x8
RotateLock 0x1e,0xff 0xff 0x000c 0 0 0 0x8
DebugMode 0x35 0xff 0x4000 0 0 0 0x8
Cancel 0x0f 0xff 0x1000 0 0 0 0x8
// Favor
Cancel 0x0f 0xff 0x1000 0 0 0 0x108"#;
let control_map = ControlMap::from_txt(input)?;
println!("txt => Struct:\n{:?}", &control_map);
// txt => json
let expected_json = r#"{
"lines": [
"BlankLine",
{
"Comment": " Lockpicking"
},
{
"EventLine": {
"event_name": "RotatePick",
"keyboard_id": {
"One": "0xff"
},
"mouse_id": {
"One": "0xa"
},
"gamepad_id": {
"One": "0x000b"
},
"remap_key": false,
"remap_mouse": false,
"remap_gamepad": false,
"event_binary_flag": "0x8"
}
},
{
"EventLine": {
"event_name": "RotateLock",
"keyboard_id": {
"Or": [
{
"One": "0x1e"
},
{
"One": "0xff"
}
]
},
"mouse_id": {
"One": "0xff"
},
"gamepad_id": {
"One": "0x000c"
},
"remap_key": false,
"remap_mouse": false,
"remap_gamepad": false,
"event_binary_flag": "0x8"
}
},
{
"EventLine": {
"event_name": "DebugMode",
"keyboard_id": {
"One": "0x35"
},
"mouse_id": {
"One": "0xff"
},
"gamepad_id": {
"One": "0x4000"
},
"remap_key": false,
"remap_mouse": false,
"remap_gamepad": false,
"event_binary_flag": "0x8"
}
},
{
"EventLine": {
"event_name": "Cancel",
"keyboard_id": {
"One": "0x0f"
},
"mouse_id": {
"One": "0xff"
},
"gamepad_id": {
"One": "0x1000"
},
"remap_key": false,
"remap_mouse": false,
"remap_gamepad": false,
"event_binary_flag": "0x8"
}
},
"BlankLine",
{
"Comment": " Favor"
},
{
"EventLine": {
"event_name": "Cancel",
"keyboard_id": {
"One": "0x0f"
},
"mouse_id": {
"One": "0xff"
},
"gamepad_id": {
"One": "0x1000"
},
"remap_key": false,
"remap_mouse": false,
"remap_gamepad": false,
"event_binary_flag": "0x108"
}
}
]
}"#;
let json = serde_json::to_string_pretty(&control_map)?;
println!("struct => json:\n{:?}", &control_map);
assert_eq!(&json, expected_json);
let re_control_map: ControlMap = serde_json::from_str(&json)?;
println!("json => txt:\n{}", &re_control_map);
// Yes, blank lines are not removed, they are applied as is.
// There are places where it would be an error to do otherwise.
let formatted_control_map = r#"
// Lockpicking
RotatePick 0xff 0xa 0x000b 0 0 0 0x8
RotateLock 0x1e+0xff 0xff 0x000c 0 0 0 0x8
DebugMode 0x35 0xff 0x4000 0 0 0 0x8
Cancel 0x0f 0xff 0x1000 0 0 0 0x8
// Favor
Cancel 0x0f 0xff 0x1000 0 0 0 0x108
"#;
assert_eq!(re_control_map.to_string(), formatted_control_map);
Ok(())
}
cargo run --example cast_and_fmt --features serde
cargo run --example parse_and_print --features serde
cargo run --example scan_code
许可
依赖
~1.6–2.7MB
~55K SLoC