use std::{io, time::Duration};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum ClientError {
#[error("failed to resolve server address {addr:?}")]
Resolve { addr: String },
#[error("socket error: {0}")]
Socket(#[from] io::Error),
#[error("socket option error while trying to {operation} for {remote}: {source}")]
SocketOption {
operation: &'static str,
remote: std::net::SocketAddr,
source: io::Error,
},
#[error("failed to restore configured socket read timeout after open negotiation: {source}")]
ReadTimeoutRestore { source: io::Error },
#[error("protocol error: {0}")]
Protocol(#[from] irtt_proto::ProtoError),
#[error("all open requests timed out")]
OpenTimeout,
#[error("open timeout {timeout:?} is below the minimum {minimum:?}")]
OpenTimeoutTooSmall {
timeout: Duration,
minimum: Duration,
},
#[error("open_timeouts must not be empty")]
NoOpenTimeouts,
#[error("server rejected the open request")]
ServerRejected,
#[error("unexpected no-test open reply")]
UnexpectedNoTestReply,
#[error("no-test reply included a non-zero connection token: {token}")]
NonZeroNoTestToken { token: u64 },
#[error("protocol version mismatch: requested {requested}, received {received}")]
ProtocolVersionMismatch { requested: i64, received: i64 },
#[error("server returned a zero connection token")]
ZeroToken,
#[error("strict negotiation rejected changed params: {reason}")]
NegotiationRejected { reason: String },
#[error("client is not open")]
NotOpen,
#[error("client session is already open")]
AlreadyOpen,
#[error("client session is already completed")]
AlreadyCompleted,
#[error("client session is already closed")]
AlreadyClosed,
#[error("duration is too large to encode as nanoseconds")]
DurationOverflow,
#[error("counter {counter} overflowed")]
CounterOverflow { counter: &'static str },
#[error("pending probe limit exceeded ({limit})")]
PendingLimitExceeded { limit: usize },
#[error("invalid configuration: {reason}")]
InvalidConfig { reason: String },
#[error("managed client worker thread panicked")]
WorkerPanicked,
}
#[derive(Debug, Error, Clone, Copy, PartialEq, Eq)]
pub enum EventSubscriptionError {
#[error("event subscription is disconnected")]
Disconnected,
}