use crate::error::AtmError;
use crate::graft::AdvisoryStreamRequest;
use crate::protocol::{FramePayload, RequestEnvelope, RequestId, ResponseEnvelope};
pub use crate::protocol::{
NotificationEvent, ReconcileRequest, ReconcileResult, RuntimeStatusSnapshot, WatchEventBatch,
WatchSubscriptionRequest,
};
pub use atm_storage::contract::{AckTransition, Message, MessageKey, TaskState};
#[doc(hidden)]
pub mod sealed {
pub trait Sealed {}
}
mod mail;
mod runtime;
mod store;
pub use mail::*;
pub use runtime::*;
pub use store::*;
pub trait AtmProtocol: sealed::Sealed {
fn request_to_frame(
&self,
request_id: RequestId,
request: RequestEnvelope,
) -> Result<FramePayload, AtmError>;
fn request_from_frame(
&self,
frame: FramePayload,
) -> Result<(RequestId, RequestEnvelope), AtmError>;
fn response_to_frame(
&self,
request_id: RequestId,
response: ResponseEnvelope,
) -> Result<FramePayload, AtmError>;
fn response_from_frame(
&self,
frame: FramePayload,
) -> Result<(RequestId, ResponseEnvelope), AtmError>;
}
pub trait ClientTransport: sealed::Sealed + Send + Sync {
fn send(&self, request: RequestEnvelope) -> Result<ResponseEnvelope, AtmError>;
}
pub trait ServerTransport: sealed::Sealed {
fn serve(
&self,
dispatcher: std::sync::Arc<dyn RequestDispatcher + Send + Sync>,
) -> Result<(), AtmError>;
}
pub trait RequestDispatcher: sealed::Sealed + Send + Sync {
fn dispatch(&self, request: RequestEnvelope) -> Result<ResponseEnvelope, AtmError>;
fn dispatch_advisory_stream(
&self,
request: AdvisoryStreamRequest,
sink: &mut dyn AdvisoryStreamSink,
) -> Result<(), AtmError>;
}
pub trait AdvisoryStreamSink {
fn emit(&mut self, response: ResponseEnvelope) -> Result<(), AtmError>;
fn stop_requested(&self) -> bool {
false
}
}
pub trait NotificationSink: sealed::Sealed {
fn deliver(&self, event: NotificationEvent) -> Result<(), AtmError>;
}
pub trait StatusSource: sealed::Sealed {
fn snapshot(&self) -> Result<RuntimeStatusSnapshot, AtmError>;
}
pub trait WatchEventSource: sealed::Sealed {
fn poll(&self, request: WatchSubscriptionRequest) -> Result<WatchEventBatch, AtmError>;
}
pub trait ReconcileCoordinator: sealed::Sealed {
fn reconcile(&self, request: ReconcileRequest) -> Result<ReconcileResult, AtmError>;
}