1#![allow(dead_code)]
2use std::{io, net::IpAddr};
3
4use thiserror::Error;
5
6use crate::{icmp::PingSequence, PingIdentifier};
7
8pub type Result<T> = std::result::Result<T, SurgeError>;
9
10#[derive(Error, Debug)]
13pub enum SurgeError {
14 #[error("buffer size was too small")]
15 IncorrectBufferSize,
16 #[error("malformed packet: {0}")]
17 MalformedPacket(#[from] MalformedPacketError),
18 #[error("io error: {0}")]
19 IOError(#[from] io::Error),
20 #[error("Request timeout for icmp_seq {seq}")]
21 Timeout { seq: PingSequence },
22 #[error("Echo Request packet.")]
23 EchoRequestPacket,
24 #[error("Network error.")]
25 NetworkError,
26 #[error("Multiple identical request")]
27 IdenticalRequests {
28 host: IpAddr,
29 ident: Option<PingIdentifier>,
30 seq: PingSequence,
31 },
32 #[error("Client has been destroyed, ping operations are no longer available")]
33 ClientDestroyed,
34}
35
36#[derive(Error, Debug)]
37pub enum MalformedPacketError {
38 #[error("expected an Ipv4Packet")]
39 NotIpv4Packet,
40 #[error("expected an Ipv6Packet")]
41 NotIpv6Packet,
42 #[error("expected an Icmpv4Packet payload")]
43 NotIcmpv4Packet,
44 #[error("expected an Icmpv6Packet")]
45 NotIcmpv6Packet,
46 #[error("payload too short, got {got}, want {want}")]
47 PayloadTooShort { got: usize, want: usize },
48}