improved error handling
This commit is contained in:
3 files changed
+33
-29
No files matched your search
@@ -2,6 +2,7 @@ mod color;
|
|||||||
mod hid_wrapper;
|
mod hid_wrapper;
|
||||||
mod keymap;
|
mod keymap;
|
||||||
mod rgb_controller;
|
mod rgb_controller;
|
||||||
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|
||||||
pub use color::Color;
|
pub use color::Color;
|
||||||
|
|||||||
+22
-22
@@ -1,16 +1,15 @@
|
|||||||
use crate::{
|
use crate::{DirectionPolicy, EFFECTS, EffectInfo, Effects, Preset};
|
||||||
DirectionPolicy, EFFECTS, EffectInfo, Effects, Preset,
|
|
||||||
};
|
|
||||||
use std::{
|
use std::{
|
||||||
collections::VecDeque,
|
collections::VecDeque,
|
||||||
fs::File,
|
fs::File,
|
||||||
io::{Read, Write},
|
io::{Read, Write},
|
||||||
vec,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum SavePresetError {
|
pub enum SavePresetError {
|
||||||
InvalidPreset,
|
InvalidPreset,
|
||||||
|
FileError(std::io::Error),
|
||||||
|
NoKeymapGiven,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -28,11 +27,13 @@ impl Preset {
|
|||||||
if !self.is_valid() {
|
if !self.is_valid() {
|
||||||
return Err(SavePresetError::InvalidPreset);
|
return Err(SavePresetError::InvalidPreset);
|
||||||
}
|
}
|
||||||
_file.write_all(&self._encode_to_buffer()).expect("");
|
match _file.write_all(&self._encode_to_buffer()?) {
|
||||||
Ok(())
|
Err(err) => Err(SavePresetError::FileError(err)),
|
||||||
|
_ => Ok(()),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn _encode_to_buffer(&self) -> Vec<u8> {
|
pub(crate) fn _encode_to_buffer(&self) -> Result<Vec<u8>, SavePresetError> {
|
||||||
let effect_info: EffectInfo = EFFECTS[usize::from(self.effect.to_u8() - 1)].clone();
|
let effect_info: EffectInfo = EFFECTS[usize::from(self.effect.to_u8() - 1)].clone();
|
||||||
let mut buffer: Vec<u8> = vec![MAGIC_NUMBER_1, MAGIC_NUMBER_2, VERSION];
|
let mut buffer: Vec<u8> = vec![MAGIC_NUMBER_1, MAGIC_NUMBER_2, VERSION];
|
||||||
|
|
||||||
@@ -50,12 +51,12 @@ impl Preset {
|
|||||||
buffer.push(self.brightness);
|
buffer.push(self.brightness);
|
||||||
|
|
||||||
if effect_info.requires_keymap {
|
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.extend(key_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer
|
Ok(buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_from_file(_file: &mut File) -> Result<Self, LoadPresetError> {
|
pub fn load_from_file(_file: &mut File) -> Result<Self, LoadPresetError> {
|
||||||
@@ -78,25 +79,24 @@ impl Preset {
|
|||||||
return Err(LoadPresetError::InvalidOrCorruptedFile);
|
return Err(LoadPresetError::InvalidOrCorruptedFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
if buffer.pop_front().expect("") != VERSION {
|
if buffer
|
||||||
|
.pop_front()
|
||||||
|
.ok_or(LoadPresetError::InvalidOrCorruptedFile)?
|
||||||
|
!= VERSION
|
||||||
|
{
|
||||||
return Err(LoadPresetError::InvalidOrCorruptedFile);
|
return Err(LoadPresetError::InvalidOrCorruptedFile);
|
||||||
//todo!("TOO BAD, Invalid VERSION")
|
//todo!("TOO BAD, Invalid VERSION")
|
||||||
}
|
}
|
||||||
|
|
||||||
if buffer[0] & 128 != 0 {
|
let effect_byte = buffer
|
||||||
buffer[0] -= 128;
|
|
||||||
save.full_color = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
let direction: u8 = (buffer[0] >> 5) & 0b11;
|
|
||||||
buffer[0] -= direction * 32;
|
|
||||||
|
|
||||||
save.effect = Effects::from_u8(
|
|
||||||
buffer
|
|
||||||
.pop_front()
|
.pop_front()
|
||||||
.ok_or(LoadPresetError::InvalidOrCorruptedFile)?,
|
|
||||||
)
|
|
||||||
.ok_or(LoadPresetError::InvalidOrCorruptedFile)?;
|
.ok_or(LoadPresetError::InvalidOrCorruptedFile)?;
|
||||||
|
|
||||||
|
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(effect_id).ok_or(LoadPresetError::InvalidOrCorruptedFile)?;
|
||||||
let effect_info: EffectInfo = EFFECTS[usize::from(save.effect.to_u8() - 1)].clone();
|
let effect_info: EffectInfo = EFFECTS[usize::from(save.effect.to_u8() - 1)].clone();
|
||||||
|
|
||||||
if !save.full_color && effect_info.can_set_color {
|
if !save.full_color && effect_info.can_set_color {
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
use crate::Keymap;
|
use crate::{Keymap, Preset};
|
||||||
use crate::Preset;
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_encode_decode() {
|
fn test_encode_decode() {
|
||||||
@@ -20,7 +19,7 @@ mod tests {
|
|||||||
0,
|
0,
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
let mut buffer: VecDeque<u8> = preset._encode_to_buffer().into();
|
let mut buffer: VecDeque<u8> = preset._encode_to_buffer().expect("error encoding").into();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
preset,
|
preset,
|
||||||
Preset::_decode_from_buffer(&mut buffer).expect("error decoding")
|
Preset::_decode_from_buffer(&mut buffer).expect("error decoding")
|
||||||
@@ -39,7 +38,7 @@ mod tests {
|
|||||||
2,
|
2,
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
let mut buffer: VecDeque<u8> = preset._encode_to_buffer().into();
|
let mut buffer: VecDeque<u8> = preset._encode_to_buffer().expect("error encoding").into();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
preset,
|
preset,
|
||||||
Preset::_decode_from_buffer(&mut buffer).expect("error decoding")
|
Preset::_decode_from_buffer(&mut buffer).expect("error decoding")
|
||||||
@@ -58,7 +57,7 @@ mod tests {
|
|||||||
1,
|
1,
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
let mut buffer: VecDeque<u8> = preset._encode_to_buffer().into();
|
let mut buffer: VecDeque<u8> = preset._encode_to_buffer().expect("error encoding").into();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
preset,
|
preset,
|
||||||
Preset::_decode_from_buffer(&mut buffer).expect("error decoding")
|
Preset::_decode_from_buffer(&mut buffer).expect("error decoding")
|
||||||
@@ -99,7 +98,7 @@ mod tests {
|
|||||||
0,
|
0,
|
||||||
Some(keymap.map()),
|
Some(keymap.map()),
|
||||||
);
|
);
|
||||||
let mut buffer: VecDeque<u8> = preset._encode_to_buffer().into();
|
let mut buffer: VecDeque<u8> = preset._encode_to_buffer().expect("error encoding").into();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
preset,
|
preset,
|
||||||
Preset::_decode_from_buffer(&mut buffer).expect("error decoding")
|
Preset::_decode_from_buffer(&mut buffer).expect("error decoding")
|
||||||
@@ -109,7 +108,8 @@ mod tests {
|
|||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
#[test]
|
#[test]
|
||||||
fn test_save_load() {
|
fn test_save_load() {
|
||||||
use std::fs::File;
|
use std::fs::{File};
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
let preset = Preset::new(
|
let preset = Preset::new(
|
||||||
crate::Effects::Static,
|
crate::Effects::Static,
|
||||||
@@ -228,5 +228,8 @@ mod tests {
|
|||||||
)
|
)
|
||||||
.expect("error loading from file")
|
.expect("error loading from file")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
fs::remove_file("/tmp/test_file.gk1k");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user