diff --git a/src/improv.rs b/src/improv.rs index a043a57..6cf2b4a 100644 --- a/src/improv.rs +++ b/src/improv.rs @@ -1,3 +1,11 @@ +use anyhow::{ + anyhow, + bail, + Context, + Error, + Result, +}; + pub const IMPROV_HEADER: [u8; 6] = [ 'I' as u8, 'M' as u8, @@ -19,7 +27,7 @@ pub enum PacketType { } impl TryFrom<&u8> for PacketType { - type Error= &'static str; + type Error = Error; fn try_from(b: &u8) -> Result { match b { @@ -27,7 +35,7 @@ impl TryFrom<&u8> for PacketType { 0x02 => Ok(Self::ErrorState), 0x03 => Ok(Self::RPCCommand), 0x04 => Ok(Self::RPCResult), - _ => Err("Cannot convert to packet type"), + _ => Err(anyhow!("Cannot convert to packet type")), } } } @@ -53,14 +61,14 @@ pub enum CurrentState { impl TryFrom<&u8> for CurrentState { - type Error= &'static str; + type Error = Error; fn try_from(b: &u8) -> Result { match b { 0x02 => Ok(Self::Ready), 0x03 => Ok(Self::Provisioning), 0x04 => Ok(Self::Provisioned), - _ => Err("Cannot convert to current state"), + _ => Err(anyhow!("Cannot convert to current state")), } } } @@ -86,7 +94,7 @@ pub enum ErrorState { } impl TryFrom<&u8> for ErrorState { - type Error= &'static str; + type Error = Error; fn try_from(b: &u8) -> Result { match b { @@ -95,7 +103,7 @@ impl TryFrom<&u8> for ErrorState { 0x02 => Ok(Self::UnknownRPCCommand), 0x03 => Ok(Self::UnableToConnect), 0x04 => Ok(Self::UnknownError), - _ => Err("Cannot convert to error type"), + _ => Err(anyhow!("Cannot convert to error type")), } } } @@ -121,14 +129,14 @@ pub enum RPCCommand { } impl TryFrom<&u8> for RPCCommand { - type Error= &'static str; + type Error = Error; fn try_from(b: &u8) -> Result { match b { 0x01 => Ok(Self::SendWifiSettings), 0x02 => Ok(Self::RequestCurrentState), 0x03 => Ok(Self::RequestDeviceInformation), - _ => Err("Cannot convert to RPC command"), + _ => Err(anyhow!("Cannot convert to RPC command")), } } } @@ -176,21 +184,21 @@ pub struct RawPacket { } impl RawPacket { - pub fn try_from_bytes(bytes: &Vec) -> Result { + pub fn try_from_bytes(bytes: &Vec) -> Result { if bytes.len() < 11 { - return Err("Packet too small"); + bail!("Packet too small"); } for i in 0..5 { if bytes[i] != IMPROV_HEADER[i] { - return Err("Improv header not found"); + bail!("Improv header not found"); } } let length: usize = bytes[8].into(); if bytes.len() != length + 10 { - return Err("Packet with invalid length"); + bail!("Packet with invalid length"); } return Ok(Self { @@ -236,13 +244,13 @@ pub enum ImprovPacket { } impl ImprovPacket { - pub fn try_from_raw_packet(raw_packet: &RawPacket) -> Result { + pub fn try_from_raw_packet(raw_packet: &RawPacket) -> Result { match raw_packet.r#type { PacketType::CurrentState => Ok(ImprovPacket::CurrentStateResponse(CurrentStateResponse::try_from_raw_packet(raw_packet)?)), PacketType::ErrorState => Ok(ImprovPacket::ErrorState(ErrorStatePacket::try_from_raw_packet(raw_packet)?)), //PacketType::RPCCommand => _, PacketType::RPCResult => Ok(ImprovPacket::RPCResult(RPCResultPacket::try_from_raw_packet(raw_packet)?)), - _ => Err("Conversion into packet type not implemented"), + _ => Err(anyhow!("Conversion into packet type not implemented")), } } } @@ -264,11 +272,11 @@ impl ImprovDataToPacket for CurrentStateResponse { } impl ImprovDataFromPacket for CurrentStateResponse { - type Error = &'static str; + type Error = Error; fn try_from_raw_packet(raw_packet: &RawPacket) -> Result{ if raw_packet.r#type != Self::packet_type { - return Err("Packet is not CurrentStateResponse"); + return Err(anyhow!("Packet is not CurrentStateResponse")); } return Ok(Self { @@ -286,11 +294,11 @@ impl ImprovDataPacketType for ErrorStatePacket { } impl ImprovDataFromPacket for ErrorStatePacket { - type Error = &'static str; + type Error = Error; fn try_from_raw_packet(raw_packet: &RawPacket) -> Result{ if raw_packet.r#type != Self::packet_type { - return Err("Packet is not ErrorState"); + return Err(anyhow!("Packet is not ErrorState")); } return Ok(Self { @@ -341,11 +349,11 @@ impl ImprovDataPacketType for RPCResultPacket { } impl ImprovDataFromPacket for RPCResultPacket { - type Error = &'static str; + type Error = Error; fn try_from_raw_packet(raw_packet: &RawPacket) -> Result{ if raw_packet.r#type != Self::packet_type { - return Err("Packet is not RPCResult"); + return Err(anyhow!("Packet is not RPCResult")); } let mut results: Vec = Vec::new();