From bbaa0cb96e84d353ecf76b7dd272b66b0fa1364f Mon Sep 17 00:00:00 2001 From: vextrixes <113197359+vextrixes@users.noreply.github.com> Date: Wed, 8 Jul 2026 01:07:15 +0200 Subject: [PATCH] improved error handling --- src/lib.rs | 1 + src/save_preset.rs | 44 +++++++++++++++++++------------------- src/tests/preset_saving.rs | 17 +++++++++------ 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5d5dbd6..bb89875 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ mod color; mod hid_wrapper; mod keymap; mod rgb_controller; +#[cfg(test)] mod tests; pub use color::Color; diff --git a/src/save_preset.rs b/src/save_preset.rs index 34d5566..524f785 100644 --- a/src/save_preset.rs +++ b/src/save_preset.rs @@ -1,16 +1,15 @@ -use crate::{ - DirectionPolicy, EFFECTS, EffectInfo, Effects, Preset, -}; +use crate::{DirectionPolicy, EFFECTS, EffectInfo, Effects, Preset}; use std::{ collections::VecDeque, fs::File, io::{Read, Write}, - vec, }; #[derive(Debug)] pub enum SavePresetError { InvalidPreset, + FileError(std::io::Error), + NoKeymapGiven, } #[derive(Debug)] @@ -28,11 +27,13 @@ impl Preset { if !self.is_valid() { return Err(SavePresetError::InvalidPreset); } - _file.write_all(&self._encode_to_buffer()).expect(""); - Ok(()) + match _file.write_all(&self._encode_to_buffer()?) { + Err(err) => Err(SavePresetError::FileError(err)), + _ => Ok(()), + } } - pub(crate) fn _encode_to_buffer(&self) -> Vec { + pub(crate) fn _encode_to_buffer(&self) -> Result, SavePresetError> { let effect_info: EffectInfo = EFFECTS[usize::from(self.effect.to_u8() - 1)].clone(); let mut buffer: Vec = vec![MAGIC_NUMBER_1, MAGIC_NUMBER_2, VERSION]; @@ -50,12 +51,12 @@ impl Preset { buffer.push(self.brightness); if effect_info.requires_keymap { - for key_color in self.keymap.expect("keymap is Option::None").iter() { + for key_color in self.keymap.ok_or(SavePresetError::NoKeymapGiven)?.iter() { buffer.extend(key_color); } } - buffer + Ok(buffer) } pub fn load_from_file(_file: &mut File) -> Result { @@ -78,25 +79,24 @@ impl Preset { return Err(LoadPresetError::InvalidOrCorruptedFile); } - if buffer.pop_front().expect("") != VERSION { + if buffer + .pop_front() + .ok_or(LoadPresetError::InvalidOrCorruptedFile)? + != VERSION + { return Err(LoadPresetError::InvalidOrCorruptedFile); //todo!("TOO BAD, Invalid VERSION") } - if buffer[0] & 128 != 0 { - buffer[0] -= 128; - save.full_color = true; - } + let effect_byte = buffer + .pop_front() + .ok_or(LoadPresetError::InvalidOrCorruptedFile)?; - let direction: u8 = (buffer[0] >> 5) & 0b11; - buffer[0] -= direction * 32; + save.full_color = (effect_byte & 0b1000_0000) != 0; + let direction: u8 = (effect_byte >> 5) & 0b11; + let effect_id: u8 = effect_byte & 0b0001_1111; - save.effect = Effects::from_u8( - buffer - .pop_front() - .ok_or(LoadPresetError::InvalidOrCorruptedFile)?, - ) - .ok_or(LoadPresetError::InvalidOrCorruptedFile)?; + save.effect = Effects::from_u8(effect_id).ok_or(LoadPresetError::InvalidOrCorruptedFile)?; let effect_info: EffectInfo = EFFECTS[usize::from(save.effect.to_u8() - 1)].clone(); if !save.full_color && effect_info.can_set_color { diff --git a/src/tests/preset_saving.rs b/src/tests/preset_saving.rs index 3662bcb..32b829d 100644 --- a/src/tests/preset_saving.rs +++ b/src/tests/preset_saving.rs @@ -2,8 +2,7 @@ mod tests { use std::collections::VecDeque; - use crate::Keymap; - use crate::Preset; + use crate::{Keymap, Preset}; #[test] fn test_encode_decode() { @@ -20,7 +19,7 @@ mod tests { 0, None, ); - let mut buffer: VecDeque = preset._encode_to_buffer().into(); + let mut buffer: VecDeque = preset._encode_to_buffer().expect("error encoding").into(); assert_eq!( preset, Preset::_decode_from_buffer(&mut buffer).expect("error decoding") @@ -39,7 +38,7 @@ mod tests { 2, None, ); - let mut buffer: VecDeque = preset._encode_to_buffer().into(); + let mut buffer: VecDeque = preset._encode_to_buffer().expect("error encoding").into(); assert_eq!( preset, Preset::_decode_from_buffer(&mut buffer).expect("error decoding") @@ -58,7 +57,7 @@ mod tests { 1, None, ); - let mut buffer: VecDeque = preset._encode_to_buffer().into(); + let mut buffer: VecDeque = preset._encode_to_buffer().expect("error encoding").into(); assert_eq!( preset, Preset::_decode_from_buffer(&mut buffer).expect("error decoding") @@ -99,7 +98,7 @@ mod tests { 0, Some(keymap.map()), ); - let mut buffer: VecDeque = preset._encode_to_buffer().into(); + let mut buffer: VecDeque = preset._encode_to_buffer().expect("error encoding").into(); assert_eq!( preset, Preset::_decode_from_buffer(&mut buffer).expect("error decoding") @@ -109,7 +108,8 @@ mod tests { #[cfg(target_os = "linux")] #[test] fn test_save_load() { - use std::fs::File; + use std::fs::{File}; + use std::fs; let preset = Preset::new( crate::Effects::Static, @@ -228,5 +228,8 @@ mod tests { ) .expect("error loading from file") ); + + fs::remove_file("/tmp/test_file.gk1k"); + } }