use microservices::esb;
use crate::bus::{BusMsg, ServiceBus};
use crate::rpc::ServiceId;
use crate::Endpoints;
pub trait StateMachine<Message, Runtime: esb::Handler<ServiceBus>>
where
esb::Error<ServiceId>: From<<Runtime as esb::Handler<ServiceBus>>::Error>,
{
type Error: std::error::Error;
fn next(
self,
event: Event<Message>,
runtime: &mut Runtime,
) -> Result<Option<Self>, Self::Error>
where
Self: Sized;
}
pub struct Event<'esb, Message> {
pub endpoints: &'esb mut Endpoints,
pub service: ServiceId,
pub source: ServiceId,
pub message: Message,
}
impl<'esb, Message> Event<'esb, Message>
where
Message: Into<BusMsg>,
{
pub fn with(
endpoints: &'esb mut Endpoints,
service: ServiceId,
source: ServiceId,
message: Message,
) -> Self {
Event { endpoints, service, source, message }
}
pub fn complete_ctl(self, message: Message) -> Result<(), esb::Error<ServiceId>> {
self.endpoints.send_to(ServiceBus::Ctl, self.service, self.source, message.into())
}
pub fn complete_ctl_service(
self,
service: ServiceId,
message: Message,
) -> Result<(), esb::Error<ServiceId>> {
self.endpoints.send_to(ServiceBus::Ctl, self.service, service, message.into())
}
pub fn send_ctl(&mut self, message: Message) -> Result<(), esb::Error<ServiceId>> {
self.endpoints.send_to(
ServiceBus::Ctl,
self.service.clone(),
self.source.clone(),
message.into(),
)
}
pub fn send_ctl_service(
&mut self,
service: ServiceId,
message: Message,
) -> Result<(), esb::Error<ServiceId>> {
self.endpoints.send_to(ServiceBus::Ctl, self.service.clone(), service, message.into())
}
pub fn complete_msg(self, message: Message) -> Result<(), esb::Error<ServiceId>> {
self.endpoints.send_to(ServiceBus::Msg, self.service, self.source, message.into())
}
pub fn complete_msg_service(
self,
service: ServiceId,
message: Message,
) -> Result<(), esb::Error<ServiceId>> {
self.endpoints.send_to(ServiceBus::Msg, self.service, service, message.into())
}
}