use crate::{HttpConnectProxyOptions, RetryOptions, VERSION, callback_based};
use http::Uri;
use std::{collections::HashMap, time::Duration};
use temporalio_common::{
data_converters::DataConverter,
protos::temporal::api::{
common::{
self,
v1::{Header, Payload, Payloads},
},
enums::v1::{
ArchivalState, HistoryEventFilterType, QueryRejectCondition, WorkflowIdConflictPolicy,
WorkflowIdReusePolicy,
},
replication::v1::ClusterReplicationConfig,
workflowservice::v1::RegisterNamespaceRequest,
},
telemetry::metrics::TemporalMeter,
};
use url::Url;
#[derive(bon::Builder, Clone, Debug)]
#[non_exhaustive]
#[builder(start_fn = new, on(String, into), state_mod(vis = "pub"))]
pub struct ConnectionOptions {
#[builder(start_fn, into)]
pub target: Url,
#[builder(default)]
pub identity: String,
pub metrics_meter: Option<TemporalMeter>,
pub tls_options: Option<TlsOptions>,
pub override_origin: Option<Uri>,
pub api_key: Option<String>,
#[builder(default)]
pub retry_options: RetryOptions,
#[builder(required, default = Some(ClientKeepAliveOptions::default()))]
pub keep_alive: Option<ClientKeepAliveOptions>,
pub headers: Option<HashMap<String, String>>,
pub binary_headers: Option<HashMap<String, Vec<u8>>>,
pub http_connect_proxy: Option<HttpConnectProxyOptions>,
#[builder(required, default = Some(DnsLoadBalancingOptions::default()))]
pub dns_load_balancing: Option<DnsLoadBalancingOptions>,
#[builder(default)]
pub disable_error_code_metric_tags: bool,
pub service_override: Option<callback_based::CallbackBasedGrpcService>,
#[builder(default)]
#[cfg_attr(feature = "core-based-sdk", builder(setters(vis = "pub")))]
pub(crate) skip_get_system_info: bool,
#[builder(default = "temporal-rust".to_owned())]
#[cfg_attr(feature = "core-based-sdk", builder(setters(vis = "pub")))]
pub(crate) client_name: String,
#[builder(default = VERSION.to_owned())]
#[cfg_attr(feature = "core-based-sdk", builder(setters(vis = "pub")))]
pub(crate) client_version: String,
}
#[cfg(feature = "core-based-sdk")]
impl ConnectionOptions {
pub fn set_skip_get_system_info(&mut self, skip: bool) {
self.skip_get_system_info = skip;
}
pub fn get_skip_get_system_info(&self) -> bool {
self.skip_get_system_info
}
pub fn get_client_name(&self) -> &str {
&self.client_name
}
pub fn get_client_version(&self) -> &str {
&self.client_version
}
}
#[derive(Clone, Debug, bon::Builder)]
#[non_exhaustive]
#[builder(start_fn = new, on(String, into), state_mod(vis = "pub"))]
pub struct ClientOptions {
#[builder(start_fn)]
pub namespace: String,
#[builder(default)]
pub data_converter: DataConverter,
}
#[derive(Clone, Debug, Default)]
pub struct TlsOptions {
pub server_root_ca_cert: Option<Vec<u8>>,
pub domain: Option<String>,
pub client_tls_options: Option<ClientTlsOptions>,
}
#[derive(Clone)]
pub struct ClientTlsOptions {
pub client_cert: Vec<u8>,
pub client_private_key: Vec<u8>,
}
#[derive(Clone, Debug)]
pub struct ClientKeepAliveOptions {
pub interval: Duration,
pub timeout: Duration,
}
impl Default for ClientKeepAliveOptions {
fn default() -> Self {
Self {
interval: Duration::from_secs(30),
timeout: Duration::from_secs(15),
}
}
}
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct DnsLoadBalancingOptions {
pub resolution_interval: Duration,
}
impl Default for DnsLoadBalancingOptions {
fn default() -> Self {
Self {
resolution_interval: Duration::from_secs(30),
}
}
}
impl std::fmt::Debug for ClientTlsOptions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "ClientTlsOptions(..)")
}
}
#[derive(Debug, Clone, bon::Builder)]
#[builder(start_fn = new, on(String, into))]
#[non_exhaustive]
pub struct WorkflowStartOptions {
#[builder(start_fn)]
pub task_queue: String,
#[builder(start_fn)]
pub workflow_id: String,
#[builder(default)]
pub id_reuse_policy: WorkflowIdReusePolicy,
#[builder(default)]
pub id_conflict_policy: WorkflowIdConflictPolicy,
pub execution_timeout: Option<Duration>,
pub run_timeout: Option<Duration>,
pub task_timeout: Option<Duration>,
pub cron_schedule: Option<String>,
pub search_attributes: Option<HashMap<String, Payload>>,
#[builder(default)]
pub enable_eager_workflow_start: bool,
pub retry_policy: Option<common::v1::RetryPolicy>,
pub start_signal: Option<WorkflowStartSignal>,
#[builder(default)]
pub links: Vec<common::v1::Link>,
#[builder(default)]
pub completion_callbacks: Vec<common::v1::Callback>,
#[builder(default)]
pub priority: Priority,
pub header: Option<Header>,
pub static_summary: Option<String>,
pub static_details: Option<String>,
}
#[derive(Debug, Clone, bon::Builder)]
#[builder(start_fn = new, on(String, into))]
#[non_exhaustive]
pub struct WorkflowStartSignal {
#[builder(start_fn)]
pub signal_name: String,
pub input: Option<Payloads>,
pub header: Option<Header>,
}
pub use temporalio_common::Priority;
#[derive(Debug, Clone, Copy, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowGetResultOptions {
#[builder(default = true)]
pub follow_runs: bool,
}
impl Default for WorkflowGetResultOptions {
fn default() -> Self {
Self { follow_runs: true }
}
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowExecuteUpdateOptions {
pub update_id: Option<String>,
pub header: Option<Header>,
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowSignalOptions {
pub request_id: Option<String>,
pub header: Option<Header>,
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowQueryOptions {
pub reject_condition: Option<QueryRejectCondition>,
pub header: Option<Header>,
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[builder(on(String, into))]
#[non_exhaustive]
pub struct WorkflowCancelOptions {
#[builder(default)]
pub reason: String,
pub request_id: Option<String>,
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[builder(on(String, into))]
#[non_exhaustive]
pub struct WorkflowTerminateOptions {
#[builder(default)]
pub reason: String,
pub details: Option<Payloads>,
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowDescribeOptions {}
const DEFAULT_WORKFLOW_EXECUTION_RETENTION_PERIOD: Duration = Duration::from_secs(60 * 60 * 24 * 3);
#[derive(Clone, Debug, bon::Builder)]
#[builder(on(String, into))]
pub struct RegisterNamespaceOptions {
pub namespace: String,
pub description: String,
#[builder(default)]
pub owner_email: String,
#[builder(default = DEFAULT_WORKFLOW_EXECUTION_RETENTION_PERIOD)]
pub workflow_execution_retention_period: Duration,
#[builder(default)]
pub clusters: Vec<ClusterReplicationConfig>,
#[builder(default)]
pub active_cluster_name: String,
#[builder(default)]
pub data: HashMap<String, String>,
#[builder(default)]
pub security_token: String,
#[builder(default)]
pub is_global_namespace: bool,
#[builder(default = ArchivalState::Unspecified)]
pub history_archival_state: ArchivalState,
#[builder(default)]
pub history_archival_uri: String,
#[builder(default = ArchivalState::Unspecified)]
pub visibility_archival_state: ArchivalState,
#[builder(default)]
pub visibility_archival_uri: String,
}
impl From<RegisterNamespaceOptions> for RegisterNamespaceRequest {
fn from(val: RegisterNamespaceOptions) -> Self {
RegisterNamespaceRequest {
namespace: val.namespace,
description: val.description,
owner_email: val.owner_email,
workflow_execution_retention_period: val
.workflow_execution_retention_period
.try_into()
.ok(),
clusters: val.clusters,
active_cluster_name: val.active_cluster_name,
data: val.data,
security_token: val.security_token,
is_global_namespace: val.is_global_namespace,
history_archival_state: val.history_archival_state as i32,
history_archival_uri: val.history_archival_uri,
visibility_archival_state: val.visibility_archival_state as i32,
visibility_archival_uri: val.visibility_archival_uri,
}
}
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowFetchHistoryOptions {
#[builder(default)]
pub skip_archival: bool,
#[builder(default)]
pub wait_new_event: bool,
#[builder(default = HistoryEventFilterType::AllEvent)]
pub event_filter_type: HistoryEventFilterType,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum WorkflowUpdateWaitStage {
Admitted,
#[default]
Accepted,
Completed,
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowStartUpdateOptions {
pub update_id: Option<String>,
pub header: Option<Header>,
#[builder(default)]
pub wait_for_stage: WorkflowUpdateWaitStage,
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowListOptions {
pub limit: Option<usize>,
}
#[derive(Debug, Clone, Default, bon::Builder)]
#[non_exhaustive]
pub struct WorkflowCountOptions {}