blob: 295c153a09bd8be431e56dae5268195fa6264120 [file] [log] [blame]
use core::fmt::{self, Debug, Display};
use crate::protocol::{PacketParseError, ResponseWriterError};
use crate::util::managed_vec::CapacityError;
/// An error which may occur during a GDB debugging session.
#[derive(Debug)]
#[non_exhaustive]
pub enum GdbStubError<T, C> {
/// Connection Error while reading request.
ConnectionRead(C),
/// Connection Error while writing response.
ConnectionWrite(ResponseWriterError<C>),
/// Client nack'd the last packet, but `gdbstub` doesn't implement
/// re-transmission.
ClientSentNack,
/// GdbStub was not provided with a packet buffer in `no_std` mode
/// (missing call to `with_packet_buffer`)
MissingPacketBuffer,
/// Packet cannot fit in the provided packet buffer.
PacketBufferOverlow,
/// Could not parse the packet into a valid command.
PacketParse(PacketParseError),
/// GDB client sent an unexpected packet.
PacketUnexpected,
/// GDB client sent a packet with too much data for the given target.
TargetMismatch,
/// Target threw a fatal error.
TargetError(T),
/// Target didn't report any active threads.
NoActiveThreads,
/// Resuming with a signal is not implemented yet. Consider opening a PR?
ResumeWithSignalUnimplemented,
/// Internal - A non-fatal error occurred (with errno-style error code)
#[doc(hidden)]
NonFatalError(u8),
}
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),
ClientSentNack => write!(f, "Client nack'd the last packet, but `gdbstub` doesn't implement re-transmission."),
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(e) => write!(f, "Could not parse the packet into a valid command: {:?}", e),
PacketUnexpected => write!(f, "Client sent an unexpected packet."),
TargetMismatch => write!(f, "GDB client sent a packet with too much data for the given target."),
TargetError(e) => write!(f, "Target threw a fatal error: {:?}", e),
NoActiveThreads => write!(f, "Target didn't report any active threads."),
ResumeWithSignalUnimplemented => write!(f, "Resuming with a signal is not implemented yet. Consider opening a PR?"),
NonFatalError(_) => write!(f, "Internal - A non-fatal error occurred (with errno-style error code)"),
}
}
}
#[cfg(feature = "std")]
impl<T, C> std::error::Error for GdbStubError<T, C>
where
C: Debug,
T: Debug,
{
}