use std::time::Duration;
use aion_core::{Payload, RunId, WorkflowId};
use serde::Serialize;
use serde::de::DeserializeOwned;
use crate::client::Client;
use crate::error::ClientError;
use crate::ops::WorkflowDescription;
use crate::stream::EventStream;
#[derive(Clone)]
pub struct WorkflowHandle {
client: Client,
workflow_id: WorkflowId,
run_id: RunId,
}
impl WorkflowHandle {
#[must_use]
pub fn from_ids(client: Client, workflow_id: WorkflowId, run_id: RunId) -> Self {
Self {
client,
workflow_id,
run_id,
}
}
#[must_use]
pub const fn workflow_id(&self) -> &WorkflowId {
&self.workflow_id
}
#[must_use]
pub const fn run_id(&self) -> &RunId {
&self.run_id
}
pub async fn signal(
&self,
name: impl Into<String>,
payload: Payload,
) -> Result<(), ClientError> {
self.client
.signal(&self.workflow_id, Some(&self.run_id), name, payload)
.await
}
pub async fn signal_typed<T>(
&self,
name: impl Into<String>,
value: &T,
) -> Result<(), ClientError>
where
T: Serialize + ?Sized,
{
self.client
.signal_typed(&self.workflow_id, Some(&self.run_id), name, value)
.await
}
pub async fn query(
&self,
name: impl Into<String>,
args: Payload,
deadline: Duration,
) -> Result<Payload, ClientError> {
self.client
.query(&self.workflow_id, Some(&self.run_id), name, args, deadline)
.await
}
pub async fn query_typed<A, R>(
&self,
name: impl Into<String>,
args: &A,
deadline: Duration,
) -> Result<R, ClientError>
where
A: Serialize + ?Sized,
R: DeserializeOwned,
{
self.client
.query_typed(&self.workflow_id, Some(&self.run_id), name, args, deadline)
.await
}
pub async fn cancel(&self, reason: impl Into<String>) -> Result<(), ClientError> {
self.client
.cancel(&self.workflow_id, Some(&self.run_id), reason)
.await
}
pub async fn describe(&self) -> Result<WorkflowDescription, ClientError> {
self.client
.describe(&self.workflow_id, Some(&self.run_id))
.await
}
#[must_use]
pub fn subscribe(&self) -> EventStream {
self.client.subscribe_workflow(&self.workflow_id)
}
}
impl PartialEq for WorkflowHandle {
fn eq(&self, other: &Self) -> bool {
self.workflow_id == other.workflow_id && self.run_id == other.run_id
}
}
impl Eq for WorkflowHandle {}
impl std::fmt::Debug for WorkflowHandle {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("WorkflowHandle")
.field("workflow_id", &self.workflow_id)
.field("run_id", &self.run_id)
.finish_non_exhaustive()
}
}