2022-01-28 20:17:34 +08:00
|
|
|
use serde_json::Value;
|
|
|
|
use std::convert::TryFrom;
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum DeviceMode {
|
|
|
|
None,
|
2022-01-29 01:10:12 +08:00
|
|
|
TasollerOne,
|
|
|
|
TasollerTwo,
|
2022-01-28 20:17:34 +08:00
|
|
|
Yuancon,
|
|
|
|
Brokenithm { ground_only: bool },
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
|
|
pub enum KeyboardLayout {
|
|
|
|
Tasoller,
|
|
|
|
Yuancon,
|
|
|
|
Deemo,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum OutputMode {
|
|
|
|
None,
|
|
|
|
Keyboard {
|
|
|
|
layout: KeyboardLayout,
|
|
|
|
sensitivity: u8,
|
|
|
|
},
|
|
|
|
Websocket {
|
|
|
|
url: String,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
|
|
pub enum ReactiveLayout {
|
|
|
|
Four,
|
|
|
|
Eight,
|
|
|
|
Sixteen,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum LedMode {
|
|
|
|
None,
|
2022-01-29 02:51:09 +08:00
|
|
|
Reactive {
|
|
|
|
layout: ReactiveLayout,
|
|
|
|
sensitivity: u8,
|
|
|
|
},
|
2022-01-28 20:17:34 +08:00
|
|
|
Attract,
|
|
|
|
Test,
|
2022-01-29 02:51:09 +08:00
|
|
|
Websocket {
|
|
|
|
url: String,
|
|
|
|
},
|
2022-01-28 20:17:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub struct Config {
|
|
|
|
pub raw: String,
|
|
|
|
pub device_mode: DeviceMode,
|
|
|
|
pub output_mode: OutputMode,
|
|
|
|
pub led_mode: LedMode,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Config {
|
|
|
|
pub fn from_str(s: &str) -> Config {
|
|
|
|
let v: Value = serde_json::from_str(s).unwrap();
|
|
|
|
|
|
|
|
Config {
|
|
|
|
raw: s.to_string(),
|
|
|
|
device_mode: match v["deviceMode"].as_str().unwrap() {
|
|
|
|
"none" => DeviceMode::None,
|
2022-01-29 01:10:12 +08:00
|
|
|
"tasoller-one" => DeviceMode::TasollerOne,
|
|
|
|
"tasoller-two" => DeviceMode::TasollerTwo,
|
2022-01-28 20:17:34 +08:00
|
|
|
"yuancon" => DeviceMode::Yuancon,
|
|
|
|
"brokenithm" => DeviceMode::Brokenithm { ground_only: false },
|
|
|
|
"brokenithm-ground" => DeviceMode::Brokenithm { ground_only: true },
|
|
|
|
_ => panic!("Invalid device mode"),
|
|
|
|
},
|
|
|
|
output_mode: match v["outputMode"].as_str().unwrap() {
|
|
|
|
"none" => OutputMode::None,
|
|
|
|
"kb-32-tasoller" => OutputMode::Keyboard {
|
|
|
|
layout: KeyboardLayout::Tasoller,
|
|
|
|
sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64().unwrap()).unwrap(),
|
|
|
|
},
|
|
|
|
"kb-32-yuancon" => OutputMode::Keyboard {
|
|
|
|
layout: KeyboardLayout::Yuancon,
|
|
|
|
sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64().unwrap()).unwrap(),
|
|
|
|
},
|
|
|
|
"kb-6-deemo" => OutputMode::Keyboard {
|
|
|
|
layout: KeyboardLayout::Deemo,
|
|
|
|
sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64().unwrap()).unwrap(),
|
|
|
|
},
|
|
|
|
"websocket" => OutputMode::Websocket {
|
|
|
|
url: v["outputWebsocketUrl"].to_string(),
|
|
|
|
},
|
|
|
|
_ => panic!("Invalid output mode"),
|
|
|
|
},
|
|
|
|
led_mode: match v["ledMode"].as_str().unwrap() {
|
|
|
|
"none" => LedMode::None,
|
|
|
|
"reactive-4" => LedMode::Reactive {
|
|
|
|
layout: ReactiveLayout::Four,
|
2022-01-29 02:51:09 +08:00
|
|
|
sensitivity: u8::try_from(v["ledSensitivity"].as_i64().unwrap()).unwrap(),
|
2022-01-28 20:17:34 +08:00
|
|
|
},
|
|
|
|
"reactive-8" => LedMode::Reactive {
|
|
|
|
layout: ReactiveLayout::Eight,
|
2022-01-29 02:51:09 +08:00
|
|
|
sensitivity: u8::try_from(v["ledSensitivity"].as_i64().unwrap()).unwrap(),
|
2022-01-28 20:17:34 +08:00
|
|
|
},
|
|
|
|
"reactive-16" => LedMode::Reactive {
|
|
|
|
layout: ReactiveLayout::Sixteen,
|
2022-01-29 02:51:09 +08:00
|
|
|
sensitivity: u8::try_from(v["ledSensitivity"].as_i64().unwrap()).unwrap(),
|
2022-01-28 20:17:34 +08:00
|
|
|
},
|
|
|
|
"attract" => LedMode::Attract,
|
|
|
|
"test" => LedMode::Test,
|
|
|
|
"websocket" => LedMode::Websocket {
|
|
|
|
url: v["ledWebsocketUrl"].to_string(),
|
|
|
|
},
|
|
|
|
_ => panic!("Invalid led mode"),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|