pub mod error;
mod factory;
mod processor;
#[cfg(feature = "rest-api-actix-web-1")]
pub mod rest_api;
pub mod validation;
use std::any::Any;
use crate::error::InternalError;
pub use factory::ServiceFactory;
pub use processor::registry::StandardServiceNetworkRegistry;
pub use processor::JoinHandles;
pub use processor::ServiceProcessor;
pub use processor::ServiceProcessorBuilder;
pub use processor::ServiceProcessorShutdownHandle;
pub use error::{
FactoryCreateError, ServiceConnectionError, ServiceDestroyError, ServiceDisconnectionError,
ServiceError, ServiceProcessorError, ServiceSendError, ServiceStartError, ServiceStopError,
};
#[derive(Clone, Debug)]
pub struct ServiceMessageContext {
pub sender: String,
pub circuit: String,
pub correlation_id: String,
}
pub trait ServiceNetworkRegistry: Send {
fn connect(
&self,
service_id: &str,
) -> Result<Box<dyn ServiceNetworkSender>, ServiceConnectionError>;
fn disconnect(&self, service_id: &str) -> Result<(), ServiceDisconnectionError>;
}
pub trait ServiceNetworkSender: Send {
fn send(&self, recipient: &str, message: &[u8]) -> Result<(), ServiceSendError>;
fn send_and_await(&self, recipient: &str, message: &[u8]) -> Result<Vec<u8>, ServiceSendError>;
fn reply(
&self,
message_origin: &ServiceMessageContext,
message: &[u8],
) -> Result<(), ServiceSendError>;
fn clone_box(&self) -> Box<dyn ServiceNetworkSender>;
fn send_with_sender(
&mut self,
recipient: &str,
message: &[u8],
sender: &str,
) -> Result<(), ServiceSendError>;
}
impl Clone for Box<dyn ServiceNetworkSender> {
fn clone(&self) -> Self {
self.clone_box()
}
}
pub trait Service: Send {
fn service_id(&self) -> &str;
fn service_type(&self) -> &str;
fn start(
&mut self,
service_registry: &dyn ServiceNetworkRegistry,
) -> Result<(), ServiceStartError>;
fn stop(
&mut self,
service_registry: &dyn ServiceNetworkRegistry,
) -> Result<(), ServiceStopError>;
fn destroy(self: Box<Self>) -> Result<(), ServiceDestroyError>;
fn purge(&mut self) -> Result<(), InternalError>;
fn handle_message(
&self,
message_bytes: &[u8],
message_context: &ServiceMessageContext,
) -> Result<(), ServiceError>;
fn as_any(&self) -> &dyn Any;
}