1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use core::fmt::{self, Debug, Display};
use crate::protocol::ResponseWriterError;
use crate::util::managed_vec::CapacityError;
#[derive(Debug, Clone)]
pub enum GdbStubError<T, C> {
ConnectionRead(C),
ConnectionWrite(ResponseWriterError<C>),
MissingPacketBuffer,
PacketBufferOverlow,
PacketParse,
PacketUnexpected,
TargetError(T),
MissingSetCurrentTid,
}
impl<T, C> From<ResponseWriterError<C>> for GdbStubError<T, C> {
fn from(e: ResponseWriterError<C>) -> Self {
GdbStubError::ConnectionWrite(e)
}
}
impl<A, T, C> From<CapacityError<A>> for GdbStubError<T, C> {
fn from(_: CapacityError<A>) -> Self {
GdbStubError::PacketBufferOverlow
}
}
impl<T, C> Display for GdbStubError<T, C>
where
C: Debug,
T: Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use self::GdbStubError::*;
match self {
ConnectionRead(e) => write!(f, "Connection Error while reading request: {:?}", e),
ConnectionWrite(e) => write!(f, "Connection Error while writing response: {:?}", e),
MissingPacketBuffer => write!(f, "GdbStub was not provided with a packet buffer in `no_std` mode (missing call to `with_packet_buffer`)"),
PacketBufferOverlow => write!(f, "Packet too big for provided buffer!"),
PacketParse => write!(f, "Could not parse the packet into a valid command."),
PacketUnexpected => write!(f, "Client sent an unexpected packet."),
TargetError(e) => write!(f, "Target threw a fatal error: {:?}", e),
MissingSetCurrentTid => write!(f, "Target doesn't implement `set_current_thread`, but reported multiple threads."),
}
}
}
#[cfg(feature = "std")]
impl<T, C> std::error::Error for GdbStubError<T, C>
where
C: Debug,
T: Debug,
{
}