use crate::agent::AgentOutput;
use crate::app::{AgentToolRef, RequestContext, SubjectContext};
use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
use crate::codec::workflow::{
from_wire_get_workflow_provider_run_events_response,
from_wire_get_workflow_provider_run_output_response,
from_wire_list_workflow_provider_definitions_response,
from_wire_list_workflow_provider_runs_response, from_wire_signal_workflow_run_response,
from_wire_workflow_definition, from_wire_workflow_event, from_wire_workflow_run,
to_wire_apply_workflow_provider_definition_request,
to_wire_cancel_workflow_provider_run_request,
to_wire_delete_workflow_provider_definition_request,
to_wire_deliver_workflow_provider_event_request,
to_wire_get_workflow_provider_definition_request,
to_wire_get_workflow_provider_run_events_request,
to_wire_get_workflow_provider_run_output_request, to_wire_get_workflow_provider_run_request,
to_wire_list_workflow_provider_definitions_request,
to_wire_list_workflow_provider_runs_request,
to_wire_set_workflow_provider_activation_paused_request,
to_wire_set_workflow_provider_definition_paused_request,
to_wire_signal_or_start_workflow_provider_run_request,
to_wire_signal_workflow_provider_run_request, to_wire_start_workflow_provider_run_request,
};
use crate::generated::v1;
use crate::rpc_support::GestaltError;
pub type WorkflowRunStatus = i32;
pub mod workflow_run_status {
pub const WORKFLOW_RUN_STATUS_UNSPECIFIED: i32 = 0;
pub const WORKFLOW_RUN_STATUS_PENDING: i32 = 1;
pub const WORKFLOW_RUN_STATUS_RUNNING: i32 = 2;
pub const WORKFLOW_RUN_STATUS_SUCCEEDED: i32 = 3;
pub const WORKFLOW_RUN_STATUS_FAILED: i32 = 4;
pub const WORKFLOW_RUN_STATUS_CANCELED: i32 = 5;
}
pub type WorkflowStepStatus = i32;
pub mod workflow_step_status {
pub const WORKFLOW_STEP_STATUS_UNSPECIFIED: i32 = 0;
pub const WORKFLOW_STEP_STATUS_PENDING: i32 = 1;
pub const WORKFLOW_STEP_STATUS_RUNNING: i32 = 2;
pub const WORKFLOW_STEP_STATUS_SKIPPED: i32 = 3;
pub const WORKFLOW_STEP_STATUS_SUCCEEDED: i32 = 4;
pub const WORKFLOW_STEP_STATUS_FAILED: i32 = 5;
pub const WORKFLOW_STEP_STATUS_UNKNOWN: i32 = 6;
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ApplyWorkflowProviderDefinitionRequest {
pub provider_name: String,
pub spec: Option<WorkflowDefinitionSpec>,
pub idempotency_key: String,
pub requested_by_subject_id: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct BoundWorkflowTarget {
pub steps: Vec<WorkflowStep>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CancelWorkflowProviderRunRequest {
pub run_id: String,
pub reason: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct DeleteWorkflowProviderDefinitionRequest {
pub definition_id: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct DeliverWorkflowProviderEventRequest {
pub app_name: String,
pub event: Option<WorkflowEvent>,
pub delivered_by_subject_id: String,
pub provider_name: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetWorkflowProviderDefinitionRequest {
pub definition_id: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetWorkflowProviderRunEventsRequest {
pub run_id: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetWorkflowProviderRunEventsResponse {
pub events: Vec<WorkflowRunEvent>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetWorkflowProviderRunOutputRequest {
pub run_id: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetWorkflowProviderRunOutputResponse {
pub output: Option<serde_json::Value>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetWorkflowProviderRunRequest {
pub run_id: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListWorkflowProviderDefinitionsRequest {
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListWorkflowProviderDefinitionsResponse {
pub definitions: Vec<WorkflowDefinition>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListWorkflowProviderRunsRequest {
pub page_size: i32,
pub page_token: String,
pub status: WorkflowRunStatus,
pub target_app: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListWorkflowProviderRunsResponse {
pub runs: Vec<WorkflowRun>,
pub next_page_token: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SetWorkflowProviderActivationPausedRequest {
pub definition_id: String,
pub activation_id: String,
pub paused: bool,
pub requested_by_subject_id: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SetWorkflowProviderDefinitionPausedRequest {
pub definition_id: String,
pub paused: bool,
pub requested_by_subject_id: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SignalOrStartWorkflowProviderRunRequest {
pub workflow_key: String,
pub idempotency_key: String,
pub created_by_subject_id: String,
pub signal: Option<WorkflowSignal>,
pub provider_name: String,
pub definition_id: String,
pub run_as: Option<SubjectContext>,
pub input: Option<serde_json::Map<String, serde_json::Value>>,
pub expected_definition_generation: i64,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SignalWorkflowProviderRunRequest {
pub run_id: String,
pub signal: Option<WorkflowSignal>,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SignalWorkflowRunResponse {
pub run: Option<WorkflowRun>,
pub signal: Option<WorkflowSignal>,
pub started_run: bool,
pub workflow_key: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct StartWorkflowProviderRunRequest {
pub idempotency_key: String,
pub created_by_subject_id: String,
pub workflow_key: String,
pub provider_name: String,
pub definition_id: String,
pub run_as: Option<SubjectContext>,
pub input: Option<serde_json::Map<String, serde_json::Value>>,
pub expected_definition_generation: i64,
pub context: Option<RequestContext>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum WorkflowActivationTrigger {
Schedule(WorkflowScheduleActivation),
Event(WorkflowEventActivation),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowActivation {
pub id: String,
pub input: Option<WorkflowValue>,
pub paused: bool,
pub trigger: Option<WorkflowActivationTrigger>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowAgentMessage {
pub role: String,
pub text: Option<WorkflowText>,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowArray {
pub values: Vec<WorkflowValue>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowDefinition {
pub id: String,
pub generation: i64,
pub target: Option<BoundWorkflowTarget>,
pub activations: Vec<WorkflowActivation>,
pub paused: bool,
pub created_by_subject_id: String,
pub created_at: Option<std::time::SystemTime>,
pub updated_at: Option<std::time::SystemTime>,
pub provider_name: String,
pub run_as: Option<SubjectContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowDefinitionSpec {
pub id: String,
pub target: Option<BoundWorkflowTarget>,
pub activations: Vec<WorkflowActivation>,
pub paused: bool,
pub run_as: Option<SubjectContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowEvent {
pub id: String,
pub source: String,
pub spec_version: String,
pub r#type: String,
pub subject: String,
pub time: Option<std::time::SystemTime>,
pub datacontenttype: String,
pub data: Option<serde_json::Map<String, serde_json::Value>>,
pub extensions: std::collections::BTreeMap<String, serde_json::Value>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowEventActivation {
pub r#match: Option<WorkflowEventMatch>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowEventMatch {
pub r#type: String,
pub source: String,
pub subject: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowEventTriggerInvocation {
pub activation_id: String,
pub event: Option<WorkflowEvent>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowManualTrigger {}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowObject {
pub fields: std::collections::BTreeMap<String, WorkflowValue>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowPathSource {
pub path: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowRun {
pub id: String,
pub status: WorkflowRunStatus,
pub target: Option<BoundWorkflowTarget>,
pub trigger: Option<WorkflowRunTrigger>,
pub created_at: Option<std::time::SystemTime>,
pub started_at: Option<std::time::SystemTime>,
pub completed_at: Option<std::time::SystemTime>,
pub status_message: String,
pub output: Option<serde_json::Value>,
pub created_by_subject_id: String,
pub workflow_key: String,
pub provider_name: String,
pub definition_id: String,
pub run_as: Option<SubjectContext>,
pub input: Option<serde_json::Map<String, serde_json::Value>>,
pub definition_generation: i64,
pub current_step_id: String,
pub steps: Vec<WorkflowStepExecution>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowRunEvent {
pub id: String,
pub run_id: String,
pub step_id: String,
pub r#type: String,
pub data: Option<serde_json::Map<String, serde_json::Value>>,
pub created_at: Option<std::time::SystemTime>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum WorkflowRunTriggerKind {
Manual(WorkflowManualTrigger),
Schedule(WorkflowScheduleTrigger),
Event(WorkflowEventTriggerInvocation),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowRunTrigger {
pub kind: Option<WorkflowRunTriggerKind>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowScheduleActivation {
pub cron: String,
pub timezone: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowScheduleTrigger {
pub activation_id: String,
pub scheduled_for: Option<std::time::SystemTime>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowSignal {
pub id: String,
pub name: String,
pub payload: Option<serde_json::Map<String, serde_json::Value>>,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
pub created_by_subject_id: String,
pub created_at: Option<std::time::SystemTime>,
pub idempotency_key: String,
pub sequence: i64,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum WorkflowStepAction {
App(WorkflowStepAppCall),
Agent(WorkflowStepAgentTurn),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowStep {
pub id: String,
pub inputs: std::collections::BTreeMap<String, WorkflowValue>,
pub when: Option<WorkflowStepWhen>,
pub timeout_seconds: i32,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
pub action: Option<WorkflowStepAction>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowStepAgentTurn {
pub provider: String,
pub model: String,
pub session_key: String,
pub prompt: Option<WorkflowText>,
pub messages: Vec<WorkflowAgentMessage>,
pub tools: Vec<AgentToolRef>,
pub output: Option<AgentOutput>,
pub model_options: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowStepAppCall {
pub name: String,
pub operation: String,
pub input: Option<WorkflowValue>,
pub connection: String,
pub instance: String,
pub credential_mode: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowStepAttempt {
pub id: String,
pub status: WorkflowStepStatus,
pub idempotency_key: String,
pub input: Option<serde_json::Value>,
pub output: Option<serde_json::Value>,
pub status_message: String,
pub started_at: Option<std::time::SystemTime>,
pub completed_at: Option<std::time::SystemTime>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowStepExecution {
pub step_id: String,
pub status: WorkflowStepStatus,
pub attempts: Vec<WorkflowStepAttempt>,
pub input: Option<serde_json::Value>,
pub output: Option<serde_json::Value>,
pub status_message: String,
pub skip_reason: String,
pub started_at: Option<std::time::SystemTime>,
pub completed_at: Option<std::time::SystemTime>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowStepInputSource {
pub step_id: String,
pub path: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowStepOutputSource {
pub step_id: String,
pub path: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowStepWhen {
pub value: Option<WorkflowValue>,
pub equals: Option<serde_json::Value>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowText {
pub template: String,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum WorkflowValueKind {
Literal(serde_json::Value),
Object(WorkflowObject),
Array(WorkflowArray),
Template(WorkflowText),
Input(WorkflowPathSource),
Signal(WorkflowPathSource),
StepOutput(WorkflowStepOutputSource),
StepInput(WorkflowStepInputSource),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct WorkflowValue {
pub kind: Option<WorkflowValueKind>,
}
pub struct Workflow {
inner: v1::workflow_client::WorkflowClient<HostServiceChannel>,
timeout: Option<std::time::Duration>,
context: Option<RequestContext>,
}
impl Workflow {
pub fn new(channel: tonic::transport::Channel) -> Self {
Self {
inner: v1::workflow_client::WorkflowClient::new(plain_channel(channel)),
timeout: None,
context: None,
}
}
pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub fn with_context(mut self, context: RequestContext) -> Self {
self.context = Some(context);
self
}
pub async fn connect() -> Result<Self, GestaltError> {
Self::connect_named("").await
}
pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
Ok(Self {
inner: v1::workflow_client::WorkflowClient::new(
connect_host_service("workflow", name).await?,
),
timeout: None,
context: None,
})
}
pub async fn apply_definition(
&mut self,
provider_name: String,
idempotency_key: String,
spec: Option<WorkflowDefinitionSpec>,
) -> Result<WorkflowDefinition, GestaltError> {
let request = ApplyWorkflowProviderDefinitionRequest {
provider_name,
idempotency_key,
spec,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_apply_workflow_provider_definition_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.apply_definition(tonic_request).await?;
Ok(from_wire_workflow_definition(response.into_inner()))
}
pub async fn apply_definition_raw(
&mut self,
request: ApplyWorkflowProviderDefinitionRequest,
) -> Result<WorkflowDefinition, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_apply_workflow_provider_definition_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.apply_definition(tonic_request).await?;
Ok(from_wire_workflow_definition(response.into_inner()))
}
pub async fn get_definition(
&mut self,
definition_id: String,
) -> Result<WorkflowDefinition, GestaltError> {
let request = GetWorkflowProviderDefinitionRequest {
definition_id,
context: self.context.clone(),
};
let mut tonic_request =
tonic::Request::new(to_wire_get_workflow_provider_definition_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_definition(tonic_request).await?;
Ok(from_wire_workflow_definition(response.into_inner()))
}
pub async fn get_definition_raw(
&mut self,
request: GetWorkflowProviderDefinitionRequest,
) -> Result<WorkflowDefinition, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_get_workflow_provider_definition_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_definition(tonic_request).await?;
Ok(from_wire_workflow_definition(response.into_inner()))
}
pub async fn list_definitions(
&mut self,
request: ListWorkflowProviderDefinitionsRequest,
) -> Result<Vec<WorkflowDefinition>, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_list_workflow_provider_definitions_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_list_workflow_provider_definitions_response(
self.inner
.list_definitions(tonic_request)
.await?
.into_inner(),
);
Ok(response.definitions)
}
pub async fn list_definitions_raw(
&mut self,
request: ListWorkflowProviderDefinitionsRequest,
) -> Result<ListWorkflowProviderDefinitionsResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_list_workflow_provider_definitions_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_definitions(tonic_request).await?;
Ok(from_wire_list_workflow_provider_definitions_response(
response.into_inner(),
))
}
pub async fn set_definition_paused(
&mut self,
definition_id: String,
paused: bool,
) -> Result<WorkflowDefinition, GestaltError> {
let request = SetWorkflowProviderDefinitionPausedRequest {
definition_id,
paused,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request = tonic::Request::new(
to_wire_set_workflow_provider_definition_paused_request(request),
);
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.set_definition_paused(tonic_request).await?;
Ok(from_wire_workflow_definition(response.into_inner()))
}
pub async fn set_definition_paused_raw(
&mut self,
request: SetWorkflowProviderDefinitionPausedRequest,
) -> Result<WorkflowDefinition, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request = tonic::Request::new(
to_wire_set_workflow_provider_definition_paused_request(request),
);
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.set_definition_paused(tonic_request).await?;
Ok(from_wire_workflow_definition(response.into_inner()))
}
pub async fn set_activation_paused(
&mut self,
definition_id: String,
activation_id: String,
paused: bool,
) -> Result<WorkflowDefinition, GestaltError> {
let request = SetWorkflowProviderActivationPausedRequest {
definition_id,
activation_id,
paused,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request = tonic::Request::new(
to_wire_set_workflow_provider_activation_paused_request(request),
);
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.set_activation_paused(tonic_request).await?;
Ok(from_wire_workflow_definition(response.into_inner()))
}
pub async fn set_activation_paused_raw(
&mut self,
request: SetWorkflowProviderActivationPausedRequest,
) -> Result<WorkflowDefinition, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request = tonic::Request::new(
to_wire_set_workflow_provider_activation_paused_request(request),
);
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.set_activation_paused(tonic_request).await?;
Ok(from_wire_workflow_definition(response.into_inner()))
}
pub async fn delete_definition(&mut self, definition_id: String) -> Result<(), GestaltError> {
let request = DeleteWorkflowProviderDefinitionRequest {
definition_id,
context: self.context.clone(),
};
let mut tonic_request =
tonic::Request::new(to_wire_delete_workflow_provider_definition_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.delete_definition(tonic_request).await?;
Ok(())
}
pub async fn delete_definition_raw(
&mut self,
request: DeleteWorkflowProviderDefinitionRequest,
) -> Result<(), GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_delete_workflow_provider_definition_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.delete_definition(tonic_request).await?;
Ok(())
}
#[allow(clippy::too_many_arguments)]
pub async fn start_run(
&mut self,
idempotency_key: String,
workflow_key: String,
provider_name: String,
definition_id: String,
expected_definition_generation: i64,
run_as: Option<SubjectContext>,
input: Option<serde_json::Map<String, serde_json::Value>>,
) -> Result<WorkflowRun, GestaltError> {
let request = StartWorkflowProviderRunRequest {
idempotency_key,
workflow_key,
provider_name,
definition_id,
expected_definition_generation,
run_as,
input,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_start_workflow_provider_run_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.start_run(tonic_request).await?;
Ok(from_wire_workflow_run(response.into_inner()))
}
pub async fn start_run_raw(
&mut self,
request: StartWorkflowProviderRunRequest,
) -> Result<WorkflowRun, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_start_workflow_provider_run_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.start_run(tonic_request).await?;
Ok(from_wire_workflow_run(response.into_inner()))
}
pub async fn list_runs(
&mut self,
page_size: i32,
page_token: String,
status: WorkflowRunStatus,
target_app: String,
) -> Result<ListWorkflowProviderRunsResponse, GestaltError> {
let request = ListWorkflowProviderRunsRequest {
page_size,
page_token,
status,
target_app,
context: self.context.clone(),
};
let mut tonic_request =
tonic::Request::new(to_wire_list_workflow_provider_runs_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_runs(tonic_request).await?;
Ok(from_wire_list_workflow_provider_runs_response(
response.into_inner(),
))
}
pub async fn list_runs_raw(
&mut self,
request: ListWorkflowProviderRunsRequest,
) -> Result<ListWorkflowProviderRunsResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_list_workflow_provider_runs_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_runs(tonic_request).await?;
Ok(from_wire_list_workflow_provider_runs_response(
response.into_inner(),
))
}
pub async fn get_run(&mut self, run_id: String) -> Result<WorkflowRun, GestaltError> {
let request = GetWorkflowProviderRunRequest {
run_id,
context: self.context.clone(),
};
let mut tonic_request =
tonic::Request::new(to_wire_get_workflow_provider_run_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_run(tonic_request).await?;
Ok(from_wire_workflow_run(response.into_inner()))
}
pub async fn get_run_raw(
&mut self,
request: GetWorkflowProviderRunRequest,
) -> Result<WorkflowRun, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_get_workflow_provider_run_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_run(tonic_request).await?;
Ok(from_wire_workflow_run(response.into_inner()))
}
pub async fn get_run_events(
&mut self,
run_id: String,
) -> Result<Vec<WorkflowRunEvent>, GestaltError> {
let request = GetWorkflowProviderRunEventsRequest {
run_id,
context: self.context.clone(),
};
let mut tonic_request =
tonic::Request::new(to_wire_get_workflow_provider_run_events_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_get_workflow_provider_run_events_response(
self.inner.get_run_events(tonic_request).await?.into_inner(),
);
Ok(response.events)
}
pub async fn get_run_events_raw(
&mut self,
request: GetWorkflowProviderRunEventsRequest,
) -> Result<GetWorkflowProviderRunEventsResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_get_workflow_provider_run_events_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_run_events(tonic_request).await?;
Ok(from_wire_get_workflow_provider_run_events_response(
response.into_inner(),
))
}
pub async fn get_run_output(
&mut self,
run_id: String,
) -> Result<Option<serde_json::Value>, GestaltError> {
let request = GetWorkflowProviderRunOutputRequest {
run_id,
context: self.context.clone(),
};
let mut tonic_request =
tonic::Request::new(to_wire_get_workflow_provider_run_output_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_get_workflow_provider_run_output_response(
self.inner.get_run_output(tonic_request).await?.into_inner(),
);
Ok(response.output)
}
pub async fn get_run_output_raw(
&mut self,
request: GetWorkflowProviderRunOutputRequest,
) -> Result<GetWorkflowProviderRunOutputResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_get_workflow_provider_run_output_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_run_output(tonic_request).await?;
Ok(from_wire_get_workflow_provider_run_output_response(
response.into_inner(),
))
}
pub async fn cancel_run(
&mut self,
run_id: String,
reason: String,
) -> Result<WorkflowRun, GestaltError> {
let request = CancelWorkflowProviderRunRequest {
run_id,
reason,
context: self.context.clone(),
};
let mut tonic_request =
tonic::Request::new(to_wire_cancel_workflow_provider_run_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.cancel_run(tonic_request).await?;
Ok(from_wire_workflow_run(response.into_inner()))
}
pub async fn cancel_run_raw(
&mut self,
request: CancelWorkflowProviderRunRequest,
) -> Result<WorkflowRun, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_cancel_workflow_provider_run_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.cancel_run(tonic_request).await?;
Ok(from_wire_workflow_run(response.into_inner()))
}
pub async fn signal_run(
&mut self,
run_id: String,
signal: Option<WorkflowSignal>,
) -> Result<SignalWorkflowRunResponse, GestaltError> {
let request = SignalWorkflowProviderRunRequest {
run_id,
signal,
context: self.context.clone(),
};
let mut tonic_request =
tonic::Request::new(to_wire_signal_workflow_provider_run_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.signal_run(tonic_request).await?;
Ok(from_wire_signal_workflow_run_response(
response.into_inner(),
))
}
pub async fn signal_run_raw(
&mut self,
request: SignalWorkflowProviderRunRequest,
) -> Result<SignalWorkflowRunResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_signal_workflow_provider_run_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.signal_run(tonic_request).await?;
Ok(from_wire_signal_workflow_run_response(
response.into_inner(),
))
}
#[allow(clippy::too_many_arguments)]
pub async fn signal_or_start_run(
&mut self,
workflow_key: String,
idempotency_key: String,
provider_name: String,
definition_id: String,
expected_definition_generation: i64,
signal: Option<WorkflowSignal>,
run_as: Option<SubjectContext>,
input: Option<serde_json::Map<String, serde_json::Value>>,
) -> Result<SignalWorkflowRunResponse, GestaltError> {
let request = SignalOrStartWorkflowProviderRunRequest {
workflow_key,
idempotency_key,
provider_name,
definition_id,
expected_definition_generation,
signal,
run_as,
input,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request = tonic::Request::new(
to_wire_signal_or_start_workflow_provider_run_request(request),
);
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.signal_or_start_run(tonic_request).await?;
Ok(from_wire_signal_workflow_run_response(
response.into_inner(),
))
}
pub async fn signal_or_start_run_raw(
&mut self,
request: SignalOrStartWorkflowProviderRunRequest,
) -> Result<SignalWorkflowRunResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request = tonic::Request::new(
to_wire_signal_or_start_workflow_provider_run_request(request),
);
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.signal_or_start_run(tonic_request).await?;
Ok(from_wire_signal_workflow_run_response(
response.into_inner(),
))
}
pub async fn deliver_event(
&mut self,
event: Option<WorkflowEvent>,
options: WorkflowDeliverEventOptions,
) -> Result<WorkflowEvent, GestaltError> {
let request = DeliverWorkflowProviderEventRequest {
event,
app_name: options.app_name,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_deliver_workflow_provider_event_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.deliver_event(tonic_request).await?;
Ok(from_wire_workflow_event(response.into_inner()))
}
pub async fn deliver_event_raw(
&mut self,
request: DeliverWorkflowProviderEventRequest,
) -> Result<WorkflowEvent, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_deliver_workflow_provider_event_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.deliver_event(tonic_request).await?;
Ok(from_wire_workflow_event(response.into_inner()))
}
}
#[derive(Clone, Debug, Default)]
pub struct WorkflowDeliverEventOptions {
pub app_name: String,
pub provider_name: String,
}