use std::fmt::{self, Display, Formatter};
use derive_more::From;
use serde::Serialize;
use static_assertions::const_assert;
use crate::effect::{
incoming::NetRequestIncoming,
requests::{MakeBlockExecutableRequest, MarkBlockCompletedRequest, StorageRequest},
};
const _STORAGE_EVENT_SIZE: usize = size_of::<Event>();
const_assert!(_STORAGE_EVENT_SIZE <= 32);
#[derive(Debug, From, Serialize)]
#[repr(u8)]
pub(crate) enum Event {
#[from]
StorageRequest(Box<StorageRequest>),
NetRequestIncoming(Box<NetRequestIncoming>),
#[from]
MarkBlockCompletedRequest(MarkBlockCompletedRequest),
#[from]
MakeBlockExecutableRequest(Box<MakeBlockExecutableRequest>),
}
impl Display for Event {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Event::StorageRequest(req) => req.fmt(f),
Event::NetRequestIncoming(incoming) => incoming.fmt(f),
Event::MarkBlockCompletedRequest(req) => req.fmt(f),
Event::MakeBlockExecutableRequest(req) => req.fmt(f),
}
}
}
impl From<NetRequestIncoming> for Event {
#[inline]
fn from(incoming: NetRequestIncoming) -> Self {
Event::NetRequestIncoming(Box::new(incoming))
}
}
impl From<StorageRequest> for Event {
#[inline]
fn from(request: StorageRequest) -> Self {
Event::StorageRequest(Box::new(request))
}
}
impl From<MakeBlockExecutableRequest> for Event {
#[inline]
fn from(request: MakeBlockExecutableRequest) -> Self {
Event::MakeBlockExecutableRequest(Box::new(request))
}
}