From 2d56431fe2df05f944f0abd83ab3a92b9da2709d Mon Sep 17 00:00:00 2001 From: 4yn Date: Sat, 12 Feb 2022 23:43:28 +0800 Subject: [PATCH] split up json parsing logic --- src-slider_io/src/config.rs | 111 ++------------------------- src-slider_io/src/device/config.rs | 36 +++++++++ src-slider_io/src/lighting/config.rs | 35 +++++++++ src-slider_io/src/output/config.rs | 50 ++++++++++++ 4 files changed, 126 insertions(+), 106 deletions(-) diff --git a/src-slider_io/src/config.rs b/src-slider_io/src/config.rs index 52bfc36..92e1558 100644 --- a/src-slider_io/src/config.rs +++ b/src-slider_io/src/config.rs @@ -3,13 +3,9 @@ use image::Luma; use log::{info, warn}; use qrcode::QrCode; use serde_json::Value; -use std::{convert::TryFrom, error::Error, fs, path::PathBuf}; +use std::{error::Error, fs, path::PathBuf}; -use crate::{ - device::config::{DeviceMode, HardwareSpec}, - lighting::config::{LedMode, ReactiveLayout}, - output::config::{GamepadLayout, KeyboardLayout, OutputMode, PollingRate}, -}; +use crate::{device::config::DeviceMode, lighting::config::LedMode, output::config::OutputMode}; pub fn list_ips() -> Result, Box> { let mut ips = vec![]; @@ -36,106 +32,9 @@ impl Config { Some(Config { raw: s.to_string(), - device_mode: match v["deviceMode"].as_str()? { - "none" => DeviceMode::None, - "tasoller-one" => DeviceMode::Hardware { - spec: HardwareSpec::TasollerOne, - }, - "tasoller-two" => DeviceMode::Hardware { - spec: HardwareSpec::TasollerTwo, - }, - "yuancon" => DeviceMode::Hardware { - spec: HardwareSpec::Yuancon, - }, - "brokenithm" => DeviceMode::Brokenithm { - ground_only: false, - led_enabled: false, - }, - "brokenithm-led" => DeviceMode::Brokenithm { - ground_only: false, - led_enabled: true, - }, - "brokenithm-ground" => DeviceMode::Brokenithm { - ground_only: true, - led_enabled: false, - }, - "brokenithm-ground-led" => DeviceMode::Brokenithm { - ground_only: true, - led_enabled: true, - }, - _ => panic!("Invalid device mode"), - }, - output_mode: match v["outputMode"].as_str().unwrap() { - "none" => OutputMode::None, - "kb-32-tasoller" => OutputMode::Keyboard { - layout: KeyboardLayout::Tasoller, - polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, - }, - "kb-32-yuancon" => OutputMode::Keyboard { - layout: KeyboardLayout::Yuancon, - polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, - }, - "kb-8-deemo" => OutputMode::Keyboard { - layout: KeyboardLayout::Deemo, - polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, - }, - "kb-voltex" => OutputMode::Keyboard { - layout: KeyboardLayout::Voltex, - polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, - }, - "kb-neardayo" => OutputMode::Keyboard { - layout: KeyboardLayout::Neardayo, - polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, - }, - "gamepad-voltex" => OutputMode::Gamepad { - layout: GamepadLayout::Voltex, - polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, - }, - "gamepad-neardayo" => OutputMode::Gamepad { - layout: GamepadLayout::Neardayo, - polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, - }, - "websocket" => OutputMode::Websocket { - url: v["outputWebsocketUrl"].as_str()?.to_string(), - polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, - }, - _ => panic!("Invalid output mode"), - }, - led_mode: match v["ledMode"].as_str()? { - "none" => LedMode::None, - "reactive-4" => LedMode::Reactive { - layout: ReactiveLayout::Even { splits: 4 }, - sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, - }, - "reactive-8" => LedMode::Reactive { - layout: ReactiveLayout::Even { splits: 8 }, - sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, - }, - "reactive-16" => LedMode::Reactive { - layout: ReactiveLayout::Even { splits: 16 }, - sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, - }, - "reactive-voltex" => LedMode::Reactive { - layout: ReactiveLayout::Voltex, - sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, - }, - "attract" => LedMode::Attract, - "test" => LedMode::Test, - "websocket" => LedMode::Websocket { - url: v["ledWebsocketUrl"].as_str()?.to_string(), - }, - "serial" => LedMode::Serial { - port: v["ledSerialPort"].as_str()?.to_string(), - }, - _ => panic!("Invalid led mode"), - }, + device_mode: DeviceMode::from_serde_value(&v)?, + output_mode: OutputMode::from_serde_value(&v)?, + led_mode: LedMode::from_serde_value(&v)?, }) } diff --git a/src-slider_io/src/device/config.rs b/src-slider_io/src/device/config.rs index 87c18a2..c53beed 100644 --- a/src-slider_io/src/device/config.rs +++ b/src-slider_io/src/device/config.rs @@ -1,3 +1,5 @@ +use serde_json::Value; + #[derive(Debug, Clone)] pub enum HardwareSpec { TasollerOne, @@ -16,3 +18,37 @@ pub enum DeviceMode { led_enabled: bool, }, } + +impl DeviceMode { + pub fn from_serde_value(v: &Value) -> Option { + Some(match v["deviceMode"].as_str()? { + "none" => DeviceMode::None, + "tasoller-one" => DeviceMode::Hardware { + spec: HardwareSpec::TasollerOne, + }, + "tasoller-two" => DeviceMode::Hardware { + spec: HardwareSpec::TasollerTwo, + }, + "yuancon" => DeviceMode::Hardware { + spec: HardwareSpec::Yuancon, + }, + "brokenithm" => DeviceMode::Brokenithm { + ground_only: false, + led_enabled: false, + }, + "brokenithm-led" => DeviceMode::Brokenithm { + ground_only: false, + led_enabled: true, + }, + "brokenithm-ground" => DeviceMode::Brokenithm { + ground_only: true, + led_enabled: false, + }, + "brokenithm-ground-led" => DeviceMode::Brokenithm { + ground_only: true, + led_enabled: true, + }, + _ => return None, + }) + } +} diff --git a/src-slider_io/src/lighting/config.rs b/src-slider_io/src/lighting/config.rs index 0e11b42..47dec93 100644 --- a/src-slider_io/src/lighting/config.rs +++ b/src-slider_io/src/lighting/config.rs @@ -1,3 +1,5 @@ +use serde_json::Value; + #[derive(Debug, Clone, Copy)] pub enum ReactiveLayout { Even { splits: usize }, @@ -20,3 +22,36 @@ pub enum LedMode { port: String, }, } + +impl LedMode { + pub fn from_serde_value(v: &Value) -> Option { + Some(match v["ledMode"].as_str()? { + "none" => LedMode::None, + "reactive-4" => LedMode::Reactive { + layout: ReactiveLayout::Even { splits: 4 }, + sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, + }, + "reactive-8" => LedMode::Reactive { + layout: ReactiveLayout::Even { splits: 8 }, + sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, + }, + "reactive-16" => LedMode::Reactive { + layout: ReactiveLayout::Even { splits: 16 }, + sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, + }, + "reactive-voltex" => LedMode::Reactive { + layout: ReactiveLayout::Voltex, + sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, + }, + "attract" => LedMode::Attract, + "test" => LedMode::Test, + "websocket" => LedMode::Websocket { + url: v["ledWebsocketUrl"].as_str()?.to_string(), + }, + "serial" => LedMode::Serial { + port: v["ledSerialPort"].as_str()?.to_string(), + }, + _ => return None, + }) + } +} diff --git a/src-slider_io/src/output/config.rs b/src-slider_io/src/output/config.rs index 044ea1e..cead109 100644 --- a/src-slider_io/src/output/config.rs +++ b/src-slider_io/src/output/config.rs @@ -1,3 +1,5 @@ +use serde_json::Value; + #[derive(Debug, Clone, Copy)] pub enum PollingRate { Sixty, @@ -63,3 +65,51 @@ impl PollingRate { } } } + +impl OutputMode { + pub fn from_serde_value(v: &Value) -> Option { + Some(match v["outputMode"].as_str().unwrap() { + "none" => OutputMode::None, + "kb-32-tasoller" => OutputMode::Keyboard { + layout: KeyboardLayout::Tasoller, + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, + }, + "kb-32-yuancon" => OutputMode::Keyboard { + layout: KeyboardLayout::Yuancon, + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, + }, + "kb-8-deemo" => OutputMode::Keyboard { + layout: KeyboardLayout::Deemo, + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, + }, + "kb-voltex" => OutputMode::Keyboard { + layout: KeyboardLayout::Voltex, + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, + }, + "kb-neardayo" => OutputMode::Keyboard { + layout: KeyboardLayout::Neardayo, + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, + }, + "gamepad-voltex" => OutputMode::Gamepad { + layout: GamepadLayout::Voltex, + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, + }, + "gamepad-neardayo" => OutputMode::Gamepad { + layout: GamepadLayout::Neardayo, + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, + }, + "websocket" => OutputMode::Websocket { + url: v["outputWebsocketUrl"].as_str()?.to_string(), + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + }, + _ => return None, + }) + } +}