1use std::{
4 any::Any,
5 num::ParseIntError,
6 sync::{
7 MutexGuard, PoisonError,
8 mpsc::{RecvError, SendError},
9 },
10};
11use thiserror::Error;
12
13use crate::{
14 packet::{
15 arp_packet::ArpPacketBuilderError,
16 heartbeat_packet::HeartbeatPacketBuilderError,
17 rst_packet::RstPacketBuilderError, syn_packet::SynPacketBuilderError,
18 },
19 scanners::{
20 ScanMessage, arp_scanner::ARPScannerBuilderError,
21 heartbeat::HeartBeatBuilderError, syn_scanner::SYNScannerBuilderError,
22 },
23 wire::{Reader, Sender},
24};
25
26#[derive(Error, Debug)]
28pub enum RLanLibError {
29 #[error("oui: {_0}")]
31 Oui(String),
32
33 #[error("wire error: {_0}")]
35 Wire(String),
36
37 #[error("failed to send notification message: {:#?}", _0)]
39 NotifierSendError(#[from] SendError<Box<ScanMessage>>),
40
41 #[error("failed to get lock on packet reader: {_0}")]
43 PacketReaderLock(String),
44
45 #[error("failed to get lock on packet sender: {_0}")]
47 PacketSenderLock(String),
48
49 #[error("thread error: {_0}")]
51 ThreadError(String),
52
53 #[error("failed to receive message from channel: {:#?}", _0)]
55 ChannelReceive(#[from] RecvError),
56
57 #[error("failed to build ARP packet: {_0}")]
59 ArpPacketBuild(#[from] ArpPacketBuilderError),
60
61 #[error("failed to build arp scanner: {_0}")]
63 ArpScannerBuild(#[from] ARPScannerBuilderError),
64
65 #[error("failed to build syn scanner: {_0}")]
67 SynScannerBuild(#[from] SYNScannerBuilderError),
68
69 #[error("failed to build heartbeat: {_0}")]
71 HeartBeatBuild(#[from] HeartBeatBuilderError),
72
73 #[error("failed to build RST packet: {_0}")]
75 RstPacketBuild(#[from] RstPacketBuilderError),
76
77 #[error("failed to build SYN packet: {_0}")]
79 SynPacketBuild(#[from] SynPacketBuilderError),
80
81 #[error("failed to build heartbeat packet: {_0}")]
83 HeartbeatPacketBuild(#[from] HeartbeatPacketBuilderError),
84
85 #[error("network interface error: {_0}")]
87 NetworkInterface(String),
88
89 #[error("scanning error: {error} - ip: {:#?}, port: {:#?}", ip, port)]
91 Scan {
92 error: String,
94 ip: Option<String>,
96 port: Option<String>,
98 },
99}
100
101impl From<Box<dyn Any + Send>> for RLanLibError {
102 fn from(value: Box<dyn Any + Send>) -> Self {
103 if let Some(s) = value.downcast_ref::<&'static str>() {
104 Self::ThreadError(format!("Thread panicked with: {}", s))
105 } else if let Some(s) = value.downcast_ref::<String>() {
106 Self::ThreadError(format!("Thread panicked with: {}", s))
107 } else {
108 Self::ThreadError("Thread panicked with an unknown type".into())
109 }
110 }
111}
112
113impl<'a> From<PoisonError<MutexGuard<'a, dyn Reader + 'static>>>
114 for RLanLibError
115{
116 fn from(value: PoisonError<MutexGuard<'a, dyn Reader + 'static>>) -> Self {
117 Self::PacketReaderLock(value.to_string())
118 }
119}
120
121impl<'a> From<PoisonError<MutexGuard<'a, dyn Sender + 'static>>>
122 for RLanLibError
123{
124 fn from(value: PoisonError<MutexGuard<'a, dyn Sender + 'static>>) -> Self {
125 Self::PacketSenderLock(value.to_string())
126 }
127}
128
129impl RLanLibError {
130 pub fn from_net_addr_parse_error(
132 ip: &str,
133 error: std::net::AddrParseError,
134 ) -> Self {
135 Self::Scan {
136 error: error.to_string(),
137 ip: Some(ip.to_string()),
138 port: None,
139 }
140 }
141
142 pub fn from_ipnet_addr_parse_error(
144 ip: &str,
145 error: ipnet::AddrParseError,
146 ) -> Self {
147 Self::Scan {
148 error: error.to_string(),
149 ip: Some(ip.to_string()),
150 port: None,
151 }
152 }
153
154 pub fn from_port_parse_int_err(port: &str, error: ParseIntError) -> Self {
156 Self::Scan {
157 error: error.to_string(),
158 ip: None,
159 port: Some(port.to_string()),
160 }
161 }
162
163 pub fn from_channel_send_error(e: SendError<ScanMessage>) -> Self {
165 RLanLibError::NotifierSendError(SendError(Box::from(e.0)))
166 }
167}
168
169unsafe impl Send for RLanLibError {}
170unsafe impl Sync for RLanLibError {}
171
172pub type Result<T> = std::result::Result<T, RLanLibError>;