use crate::i2cp::message::{MessageType, SessionId, I2CP_HEADER_SIZE, LOG_TARGET};
use bytes::{BufMut, BytesMut};
#[derive(Debug)]
pub enum SessionStatusKind {
Destroyed,
Created,
#[allow(unused)]
Updated,
#[allow(unused)]
Invalid,
Refused,
}
impl SessionStatusKind {
pub fn as_u8(self) -> u8 {
match self {
Self::Destroyed => 0,
Self::Created => 1,
Self::Updated => 2,
Self::Invalid => 3,
Self::Refused => 4,
}
}
#[allow(unused)]
pub fn from_u8(kind: u8) -> Option<Self> {
match kind {
0 => Some(Self::Destroyed),
1 => Some(Self::Created),
2 => Some(Self::Updated),
3 => Some(Self::Invalid),
4 => Some(Self::Refused),
kind => {
tracing::warn!(
target: LOG_TARGET,
?kind,
"invalid session status",
);
None
}
}
}
}
pub struct SessionStatus(());
impl SessionStatus {
pub fn new(session_id: SessionId, kind: SessionStatusKind) -> BytesMut {
let mut out = BytesMut::with_capacity(I2CP_HEADER_SIZE + 3);
out.put_u32(3u32);
out.put_u8(MessageType::SessionStatus.as_u8());
out.put_u16(session_id.as_u16());
out.put_u8(kind.as_u8());
out
}
}