use super::Config;
use crate::kernel::outgoing_processing_result::ProcessingResult;
use crate::kernel::CloudEventRoutingArgs;
use crate::runtime::channel::BoxedSender;
use crate::runtime::{InternalServerFnRef, InternalServerId};
use cloudevents::Event;
use serde::Serialize;
use std::fmt;
pub type CloudEventMessageRoutingId = String;
pub enum BrokerEvent {
ScheduleInternalServer(ScheduleInternalServerStatic),
InternalServerScheduled(InternalServerId, BoxedSender),
Init,
ConfigUpdated(Config, InternalServerId),
IncomingCloudEvent(IncomingCloudEvent),
RoutingResult(RoutingResult),
OutgoingCloudEvent(OutgoingCloudEvent),
OutgoingCloudEventProcessed(OutgoingCloudEventProcessed),
IncomingCloudEventProcessed(CloudEventMessageRoutingId, ProcessingResult),
Batch(Vec<BrokerEvent>),
HealthCheckRequest(HealthCheckRequest),
HealthCheckResponse(HealthCheckResponse),
}
impl fmt::Display for BrokerEvent {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BrokerEvent::Init => write!(f, "Init"),
BrokerEvent::ScheduleInternalServer(event) => {
write!(f, "ScheduleInternalServer server_id={}", event.id)
}
BrokerEvent::InternalServerScheduled(id, _) => {
write!(f, "InternalServerScheduled server_id={}", id)
}
BrokerEvent::IncomingCloudEvent(event) => {
write!(f, "IncomingCloudEvent receiver_id={}", event.incoming_id)
}
BrokerEvent::RoutingResult(event) => {
write!(f, "RoutingResult receiver_id={}", event.incoming_id)
}
BrokerEvent::ConfigUpdated(_, id) => write!(f, "ConfigUpdated destination_id={}", id),
BrokerEvent::OutgoingCloudEvent(event) => write!(
f,
"OutgoingCloudEvent destination_id={}",
event.destination_id
),
BrokerEvent::OutgoingCloudEventProcessed(event) => {
write!(f, "OutgoingCloudEventProcessed result={}", event.result)
}
BrokerEvent::IncomingCloudEventProcessed(_, state) => {
write!(f, "IncomingCloudEventProcessed state={}", state)
}
BrokerEvent::Batch(_) => write!(f, "Batch"),
BrokerEvent::HealthCheckRequest(_) => write!(f, "HealthCheckRequest"),
BrokerEvent::HealthCheckResponse(_) => write!(f, "HealthCheckResponse"),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct IncomingCloudEvent {
pub incoming_id: InternalServerId,
pub routing_id: CloudEventMessageRoutingId,
pub cloud_event: Event,
pub args: CloudEventRoutingArgs,
}
#[derive(Clone, Debug, PartialEq)]
pub struct RoutingResult {
pub incoming_id: InternalServerId,
pub routing_id: CloudEventMessageRoutingId,
pub routing: Vec<OutgoingCloudEvent>,
pub args: CloudEventRoutingArgs,
pub result: ProcessingResult,
}
#[derive(Clone, Debug, PartialEq)]
pub struct OutgoingCloudEvent {
pub routing_id: CloudEventMessageRoutingId,
pub cloud_event: Event,
pub destination_id: InternalServerId,
pub args: CloudEventRoutingArgs,
}
#[derive(Clone, Debug, PartialEq)]
pub struct OutgoingCloudEventProcessed {
pub sender_id: InternalServerId,
pub routing_id: CloudEventMessageRoutingId,
pub result: ProcessingResult,
}
#[derive(Clone, Debug, PartialEq)]
pub struct ScheduleInternalServer<'a> {
pub id: InternalServerId,
pub function: InternalServerFnRef<'a>,
}
pub struct HealthCheckRequest {
pub id: String,
pub sender_id: InternalServerId,
pub destination_id: InternalServerId,
}
pub struct HealthCheckResponse {
pub id: String,
pub sender_id: InternalServerId,
pub destination_id: InternalServerId,
pub status: HealthCheckStatus,
}
#[derive(Debug, PartialEq, Clone, Serialize)]
pub enum HealthCheckStatus {
Healthy,
Unhealthy(String),
}
pub type ScheduleInternalServerStatic = ScheduleInternalServer<'static>;