use core::mem;
use crate::{io::Transport, types::ReasonCode};
#[derive(Debug, Default)]
pub(crate) enum NetState<N: Transport> {
Ok(N),
Faulted(N, ReasonCode),
#[default]
Terminated,
}
pub enum Error {
Faulted,
Terminated,
}
impl<N: Transport> NetState<N> {
pub fn is_ok(&self) -> bool {
matches!(self, Self::Ok(_))
}
pub fn replace(&mut self, net: N) {
*self = Self::Ok(net);
}
pub fn get(&mut self) -> Result<&mut N, Error> {
match self {
Self::Ok(n) => Ok(n),
Self::Faulted(_, _) => Err(Error::Faulted),
Self::Terminated => Err(Error::Terminated),
}
}
pub fn fail(&mut self, reason_code: ReasonCode) {
*self = match mem::take(self) {
Self::Ok(n) | Self::Faulted(n, _) => Self::Faulted(n, reason_code),
Self::Terminated => Self::Terminated,
}
}
pub fn terminate(&mut self) -> Option<N> {
match mem::take(self) {
Self::Ok(n) => Some(n),
Self::Faulted(n, _) => Some(n),
Self::Terminated => None,
}
}
}