Crates.io | controlmap-parser |
lib.rs | controlmap-parser |
version | 0.3.0 |
source | src |
created_at | 2022-02-03 19:47:57.985178 |
updated_at | 2023-11-17 20:37:19.430772 |
description | (De)Serializer of `controlmap.txt` in Skyrim |
homepage | https://github.com/SARDONYX-sard/controlmap-parser |
repository | https://github.com/SARDONYX-sard/controlmap-parser |
max_upload_size | |
id | 526349 |
size | 58,075 |
The controlmap.txt parser for Skyrim.
controlmap.txt
=> json
json
=> controlmap.txt
(formatted with preserved comments)[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
MIT or Apache 2.0