use super::opcode::{Q_CAPS, Q_HEALTH, Q_MOUSE_INFO, Q_RATE, Q_STATS, Q_VERSION};
use crate::types::{Caps, Health, LogLevel, LogLine, MouseInfo, Rate, Stats, Version};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Resp {
Version(Version),
Health(Health),
MouseInfo(MouseInfo),
Caps(Caps),
Rate(Rate),
Stats(Stats),
}
pub fn parse_resp(payload: &[u8]) -> Option<Resp> {
let what = *payload.first()?;
match what {
Q_VERSION => {
if payload.len() < 5 {
return None;
}
Some(Resp::Version(Version {
proto_ver: payload[1],
fw_major: payload[2],
fw_minor: payload[3],
fw_patch: payload[4],
}))
}
Q_HEALTH => {
if payload.len() < 2 {
return None;
}
Some(Resp::Health(Health::from_flags(payload[1])))
}
Q_MOUSE_INFO => MouseInfo::from_payload(payload).map(Resp::MouseInfo),
Q_CAPS => Caps::from_payload(payload).map(Resp::Caps),
Q_RATE => Rate::from_payload(payload).map(Resp::Rate),
Q_STATS => Stats::from_payload(payload).map(Resp::Stats),
_ => None,
}
}
pub fn parse_log(payload: &[u8]) -> LogLine {
match payload.split_first() {
Some((&level, text)) => LogLine {
level: LogLevel::from_u8(level),
text: String::from_utf8_lossy(text).into_owned(),
},
None => LogLine {
level: LogLevel::Info,
text: String::new(),
},
}
}