use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound(
serialize = "E: serde::Serialize",
deserialize = "E: serde::de::DeserializeOwned"
))]
pub enum AttemptFailure<E> {
Error(E),
Timeout,
}
impl<E> AttemptFailure<E> {
#[inline]
pub fn as_error(&self) -> Option<&E> {
match self {
Self::Error(error) => Some(error),
Self::Timeout => None,
}
}
#[inline]
pub fn into_error(self) -> Option<E> {
match self {
Self::Error(error) => Some(error),
Self::Timeout => None,
}
}
}
impl<E: fmt::Display> fmt::Display for AttemptFailure<E> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Error(error) => write!(f, "{error}"),
Self::Timeout => write!(f, "attempt timed out"),
}
}
}