1use super::super::channels::ChannelName;
2use super::super::error::AionSurfaceError;
3use super::super::types::{Payload, SignalPayload};
4use crate::channel::{ChannelHandle, ChannelMode, Schema};
5use crate::conversation::ParticipantPid;
6
7#[derive(Clone, Debug)]
9pub struct SignalDeclaration {
10 pub signal_name: String,
12 pub content_type: String,
14 pub payload_schema: Option<Schema>,
16}
17
18impl SignalDeclaration {
19 #[must_use]
21 pub fn new(signal_name: impl Into<String>, content_type: impl Into<String>) -> Self {
22 Self {
23 signal_name: signal_name.into(),
24 content_type: content_type.into(),
25 payload_schema: None,
26 }
27 }
28
29 #[must_use]
31 pub fn with_payload_schema(
32 signal_name: impl Into<String>,
33 content_type: impl Into<String>,
34 payload_schema: Schema,
35 ) -> Self {
36 Self {
37 signal_name: signal_name.into(),
38 content_type: content_type.into(),
39 payload_schema: Some(payload_schema),
40 }
41 }
42}
43
44#[derive(Clone, Debug)]
46pub struct SignalWorkflowConfig {
47 pub namespace: String,
49 pub workflow_id: String,
51 pub workflow_pid: ParticipantPid,
53 pub declarations: Vec<SignalDeclaration>,
55 pub mode: ChannelMode,
57}
58
59impl SignalWorkflowConfig {
60 #[must_use]
62 pub fn new(
63 namespace: impl Into<String>,
64 id: impl Into<String>,
65 pid: ParticipantPid,
66 declarations: Vec<SignalDeclaration>,
67 ) -> Self {
68 Self {
69 namespace: namespace.into(),
70 workflow_id: id.into(),
71 workflow_pid: pid,
72 declarations,
73 mode: ChannelMode::Ephemeral,
74 }
75 }
76
77 #[must_use]
79 pub const fn with_mode(mut self, mode: ChannelMode) -> Self {
80 self.mode = mode;
81 self
82 }
83}
84
85#[derive(Clone, Debug)]
87pub struct SignalChannel {
88 pub channel_name: ChannelName,
90 pub handle: ChannelHandle,
92 pub declarations: Vec<SignalDeclaration>,
94 pub mode: ChannelMode,
96}
97
98#[derive(Clone, Copy, Debug, PartialEq, Eq)]
100pub enum WorkflowTerminalStatus {
101 Completed,
103 Failed,
105 Cancelled,
107 TimedOut,
109}
110
111impl WorkflowTerminalStatus {
112 pub(super) const fn as_str(self) -> &'static str {
113 match self {
114 Self::Completed => "Completed",
115 Self::Failed => "Failed",
116 Self::Cancelled => "Cancelled",
117 Self::TimedOut => "TimedOut",
118 }
119 }
120}
121
122#[derive(Clone, Debug, PartialEq, Eq)]
124pub enum SignalOperationKind {
125 SignalDelivered,
127}
128
129#[derive(Clone, Debug, PartialEq, Eq)]
131pub struct SignalOperation {
132 pub kind: SignalOperationKind,
134 pub channel_name: String,
136 pub workflow_id: String,
138 pub signal_name: String,
140 pub payload: Payload,
142 pub mode: ChannelMode,
144}
145
146impl SignalOperation {
147 pub(super) fn delivered(
148 channel_name: &ChannelName,
149 workflow_id: &str,
150 signal: &SignalPayload,
151 mode: ChannelMode,
152 ) -> Self {
153 Self {
154 kind: SignalOperationKind::SignalDelivered,
155 channel_name: String::from(channel_name.clone()),
156 workflow_id: workflow_id.to_owned(),
157 signal_name: signal.signal_name.clone(),
158 payload: signal.payload.clone(),
159 mode,
160 }
161 }
162}
163
164#[derive(Clone, Debug, PartialEq, Eq)]
166pub struct RecordedSignalDelivery {
167 pub channel_name: String,
169 pub workflow_id: String,
171 pub signal: SignalPayload,
173}
174
175impl RecordedSignalDelivery {
176 #[must_use]
178 pub const fn new(channel_name: String, workflow_id: String, signal: SignalPayload) -> Self {
179 Self {
180 channel_name,
181 workflow_id,
182 signal,
183 }
184 }
185}
186
187pub trait SignalDeliverer: std::fmt::Debug + Send + Sync {
189 fn deliver(
195 &self,
196 workflow_pid: ParticipantPid,
197 signal: SignalPayload,
198 ) -> Result<(), AionSurfaceError>;
199}
200
201pub trait SignalRecorder: std::fmt::Debug + Send + Sync {
203 fn replay_deliveries(
209 &self,
210 channel_name: &str,
211 workflow_id: &str,
212 ) -> Result<Vec<RecordedSignalDelivery>, AionSurfaceError>;
213
214 fn record(&self, operation: SignalOperation) -> Result<(), AionSurfaceError>;
220}