1use crate::{
2 ClientInterceptor, HttpConnectProxyOptions, RetryOptions, RpcOptions, VERSION, callback_based,
3};
4#[cfg(feature = "experimental")]
5use crate::{ClientPlugin, ErasedClientPlugin};
6use http::Uri;
7use std::{collections::HashMap, sync::Arc, time::Duration};
8use temporalio_common::{
9 ActivityCloseTimeouts, MemoValues, RetryPolicy,
10 data_converters::{
11 DataConverter, GenericPayloadConverter, PayloadConversionError, PayloadConverter,
12 SerializationContext, SerializationContextData, WorkflowSerializationContext,
13 },
14 payload_visitor::encode_payloads,
15 protos::temporal::api::{
16 common::{
17 self,
18 v1::{Header, Memo as ProtoMemo, Payloads},
19 },
20 enums::v1::{
21 ActivityIdConflictPolicy as ProtoActivityIdConflictPolicy,
22 ActivityIdReusePolicy as ProtoActivityIdReusePolicy, ArchivalState,
23 HistoryEventFilterType, QueryRejectCondition, WorkflowIdConflictPolicy,
24 WorkflowIdReusePolicy,
25 },
26 replication::v1::ClusterReplicationConfig,
27 sdk::v1::UserMetadata,
28 workflowservice::v1::RegisterNamespaceRequest,
29 },
30 search_attributes::SearchAttributes,
31 telemetry::metrics::TemporalMeter,
32};
33#[cfg(feature = "dynamic-tls")]
34use tokio_rustls::rustls::client::ResolvesClientCert;
35use tokio_rustls::rustls::client::danger::ServerCertVerifier;
36use url::Url;
37
38pub(crate) const DEFAULT_PAYLOADS_WARN_SIZE: u64 = 512 * 1024;
39pub(crate) const DEFAULT_MEMO_WARN_SIZE: u64 = 2 * 1024;
40
41#[derive(bon::Builder, Clone, Debug)]
43#[non_exhaustive]
44#[builder(start_fn = new, on(String, into), state_mod(vis = "pub"))]
45pub struct ConnectionOptions {
46 #[builder(start_fn, into)]
48 pub target: Url,
49 #[builder(default)]
51 pub identity: String,
52 pub metrics_meter: Option<TemporalMeter>,
55 pub tls_options: Option<TlsOptions>,
59 pub override_origin: Option<Uri>,
65 pub api_key: Option<String>,
68 pub connect_timeout: Option<Duration>,
73 #[builder(default)]
75 pub retry_options: RetryOptions,
76 #[builder(required, default = Some(ClientKeepAliveOptions::default()))]
79 pub keep_alive: Option<ClientKeepAliveOptions>,
80 pub headers: Option<HashMap<String, String>>,
86 pub binary_headers: Option<HashMap<String, Vec<u8>>>,
91 pub http_connect_proxy: Option<HttpConnectProxyOptions>,
93 #[builder(required, default = Some(DnsLoadBalancingOptions::default()))]
98 pub dns_load_balancing: Option<DnsLoadBalancingOptions>,
99 #[builder(default)]
101 pub disable_error_code_metric_tags: bool,
102 pub service_override: Option<callback_based::CallbackBasedGrpcService>,
104 #[builder(default)]
109 pub grpc_compression: GrpcCompression,
110 #[cfg(feature = "experimental")]
114 #[cfg_attr(
115 docsrs,
116 builder(setters(
117 some_fn(name = payload_limits_impl, vis = "pub(crate)"),
118 option_fn(name = maybe_payload_limits_impl, vis = "pub(crate)")
119 ))
120 )]
121 #[builder(default)]
122 pub payload_limits: PayloadLimitsOptions,
123
124 #[builder(default)]
127 #[cfg_attr(feature = "core-based-sdk", builder(setters(vis = "pub")))]
128 pub(crate) skip_get_system_info: bool,
129 #[builder(default = "temporal-rust".to_owned())]
132 #[cfg_attr(feature = "core-based-sdk", builder(setters(vis = "pub")))]
133 pub(crate) client_name: String,
134 #[builder(default = VERSION.to_owned())]
139 #[cfg_attr(feature = "core-based-sdk", builder(setters(vis = "pub")))]
140 pub(crate) client_version: String,
141}
142
143#[cfg(all(feature = "experimental", docsrs))]
146impl<S: connection_options_builder::State> ConnectionOptionsBuilder<S> {
147 #[doc(cfg(feature = "experimental"))]
149 pub fn payload_limits(
150 self,
151 value: PayloadLimitsOptions,
152 ) -> ConnectionOptionsBuilder<connection_options_builder::SetPayloadLimits<S>>
153 where
154 S::PayloadLimits: connection_options_builder::IsUnset,
155 {
156 self.payload_limits_impl(value)
157 }
158
159 #[doc(cfg(feature = "experimental"))]
161 pub fn maybe_payload_limits(
162 self,
163 value: Option<PayloadLimitsOptions>,
164 ) -> ConnectionOptionsBuilder<connection_options_builder::SetPayloadLimits<S>>
165 where
166 S::PayloadLimits: connection_options_builder::IsUnset,
167 {
168 self.maybe_payload_limits_impl(value)
169 }
170}
171
172#[cfg(feature = "core-based-sdk")]
174impl ConnectionOptions {
175 pub fn set_skip_get_system_info(&mut self, skip: bool) {
177 self.skip_get_system_info = skip;
178 }
179 pub fn get_skip_get_system_info(&self) -> bool {
181 self.skip_get_system_info
182 }
183 pub fn get_client_name(&self) -> &str {
185 &self.client_name
186 }
187 pub fn get_client_version(&self) -> &str {
189 &self.client_version
190 }
191}
192
193#[derive(Clone, derive_more::Debug, bon::Builder)]
195#[non_exhaustive]
196#[builder(start_fn = new, on(String, into), state_mod(vis = "pub"))]
197pub struct ClientOptions {
198 #[builder(start_fn)]
200 pub namespace: String,
201
202 #[builder(field)]
203 #[debug(skip)]
204 #[cfg(feature = "experimental")]
205 plugins: Vec<ErasedClientPlugin>,
206
207 #[builder(field)]
208 #[debug(skip)]
209 #[cfg(feature = "experimental")]
210 client_plugins_applied: bool,
211
212 #[builder(default)]
214 pub data_converter: DataConverter,
215 #[builder(default)]
217 #[debug(skip)]
218 pub client_interceptors: Vec<Arc<dyn ClientInterceptor>>,
219}
220
221#[cfg(feature = "experimental")]
222impl<S: client_options_builder::State> ClientOptionsBuilder<S> {
223 pub fn plugin<P: Into<ErasedClientPlugin>>(mut self, plugin: P) -> Self {
227 self.plugins.push(plugin.into());
228 self
229 }
230
231 pub fn plugins<I, P>(mut self, plugins: I) -> Self
235 where
236 I: IntoIterator<Item = P>,
237 P: Into<ErasedClientPlugin>,
238 {
239 self.plugins.extend(plugins.into_iter().map(Into::into));
240 self
241 }
242
243 pub fn client_plugin<P: ClientPlugin>(mut self, plugin: P) -> Self {
247 self.plugins.push(ErasedClientPlugin::new(plugin));
248 self
249 }
250}
251
252impl ClientOptions {
253 #[cfg(feature = "experimental")]
259 pub fn plugins(&self) -> &[ErasedClientPlugin] {
260 &self.plugins
261 }
262
263 #[cfg(feature = "experimental")]
264 pub(crate) fn client_plugins_applied(&self) -> bool {
265 self.client_plugins_applied
266 }
267
268 #[cfg(feature = "experimental")]
269 pub(crate) fn mark_client_plugins_applied(&mut self) {
270 self.client_plugins_applied = true;
271 }
272}
273
274#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
277#[non_exhaustive]
278pub enum GrpcCompression {
279 None,
281 #[default]
283 Gzip,
284}
285
286#[derive(Clone, bon::Builder)]
288#[non_exhaustive]
289pub struct TlsOptions {
290 pub server_root_ca_cert: Option<Vec<u8>>,
294 pub domain: Option<String>,
297 pub client_tls_options: Option<ClientTlsOptions>,
302 pub server_cert_verifier: Option<Arc<dyn ServerCertVerifier>>,
319 #[cfg(feature = "dynamic-tls")]
324 pub client_cert_resolver: Option<Arc<dyn ResolvesClientCert>>,
325}
326
327impl Default for TlsOptions {
328 fn default() -> Self {
329 Self::builder().build()
330 }
331}
332
333impl std::fmt::Debug for TlsOptions {
334 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
335 let mut s = f.debug_struct("TlsOptions");
336 s.field(
337 "server_root_ca_cert",
338 &self
339 .server_root_ca_cert
340 .as_ref()
341 .map(|c| format!("{} bytes", c.len())),
342 );
343 s.field("domain", &self.domain);
344 s.field("client_tls_options", &self.client_tls_options);
345 s.field(
346 "server_cert_verifier",
347 &self.server_cert_verifier.as_ref().map(|_| "<custom>"),
348 );
349 #[cfg(feature = "dynamic-tls")]
350 s.field(
351 "client_cert_resolver",
352 &self.client_cert_resolver.as_ref().map(|_| "<custom>"),
353 );
354 s.finish()
355 }
356}
357
358#[derive(Clone, bon::Builder)]
360#[non_exhaustive]
361pub struct ClientTlsOptions {
362 pub client_cert: Vec<u8>,
364 pub client_private_key: Vec<u8>,
366}
367
368#[derive(Clone, Debug, PartialEq, bon::Builder)]
370#[non_exhaustive]
371pub struct ClientKeepAliveOptions {
372 #[builder(default = Duration::from_secs(30))]
374 pub interval: Duration,
375 #[builder(default = Duration::from_secs(15))]
377 pub timeout: Duration,
378}
379
380impl Default for ClientKeepAliveOptions {
381 fn default() -> Self {
382 Self::builder().build()
383 }
384}
385
386#[derive(Clone, Debug, PartialEq, bon::Builder)]
388#[non_exhaustive]
389pub struct DnsLoadBalancingOptions {
390 #[builder(default = Duration::from_secs(30))]
392 pub resolution_interval: Duration,
393}
394
395impl Default for DnsLoadBalancingOptions {
396 fn default() -> Self {
397 Self::builder().build()
398 }
399}
400
401#[cfg(feature = "experimental")]
404#[derive(Clone, Debug, PartialEq, bon::Builder)]
405#[non_exhaustive]
406pub struct PayloadLimitsOptions {
407 #[builder(default = DEFAULT_PAYLOADS_WARN_SIZE)]
410 pub payloads_warn_size: u64,
411 #[builder(default = DEFAULT_MEMO_WARN_SIZE)]
414 pub memo_warn_size: u64,
415}
416
417#[cfg(feature = "experimental")]
418impl Default for PayloadLimitsOptions {
419 fn default() -> Self {
420 Self::builder().build()
421 }
422}
423
424impl std::fmt::Debug for ClientTlsOptions {
425 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
427 write!(f, "ClientTlsOptions(..)")
428 }
429}
430
431#[derive(Debug, Clone, bon::Builder)]
433#[builder(start_fn = new, on(String, into))]
434#[non_exhaustive]
435pub struct WorkflowStartOptions {
436 #[builder(start_fn)]
438 pub task_queue: String,
439
440 #[builder(start_fn)]
442 pub workflow_id: String,
443
444 #[builder(default)]
446 pub id_reuse_policy: WorkflowIdReusePolicy,
447
448 #[builder(default)]
451 pub id_conflict_policy: WorkflowIdConflictPolicy,
452
453 pub execution_timeout: Option<Duration>,
456
457 pub run_timeout: Option<Duration>,
459
460 pub task_timeout: Option<Duration>,
462
463 pub cron_schedule: Option<String>,
465
466 pub search_attributes: Option<SearchAttributes>,
468
469 #[builder(default)]
471 pub enable_eager_workflow_start: bool,
472
473 #[builder(into)]
475 pub retry_policy: Option<RetryPolicy>,
476
477 #[builder(default)]
479 pub links: Vec<common::v1::Link>,
480
481 #[builder(default)]
484 pub completion_callbacks: Vec<common::v1::Callback>,
485
486 #[builder(default)]
488 pub priority: Priority,
489
490 pub header: Option<Header>,
492
493 pub memo: Option<MemoValues>,
495
496 pub static_summary: Option<String>,
498
499 pub static_details: Option<String>,
501
502 #[builder(default)]
504 pub rpc_options: RpcOptions,
505}
506
507impl WorkflowStartOptions {
508 pub(crate) async fn encoded_memo(
509 &self,
510 data_converter: &DataConverter,
511 ) -> Result<Option<ProtoMemo>, PayloadConversionError> {
512 let Some(memo) = &self.memo else {
513 return Ok(None);
514 };
515
516 let payload_converter = data_converter.payload_converter();
517 let context_data = SerializationContextData::Workflow(WorkflowSerializationContext::new());
518 let context = SerializationContext::new(&context_data, payload_converter);
519 let mut memo = ProtoMemo {
520 fields: memo
521 .iter()
522 .map(|(key, value)| {
523 payload_converter
524 .to_payload(&context, value)
525 .map(|payload| (key.to_owned(), payload))
526 })
527 .collect::<Result<_, _>>()?,
528 };
529 encode_payloads(
530 &mut memo,
531 data_converter.codec(),
532 &SerializationContextData::Workflow(WorkflowSerializationContext::new()),
533 )
534 .await?;
535 Ok(Some(memo))
536 }
537
538 pub(crate) fn user_metadata(&self) -> Option<UserMetadata> {
539 (self.static_summary.is_some() || self.static_details.is_some()).then(|| {
540 let payload_converter = PayloadConverter::default();
541 let context_data =
542 SerializationContextData::Workflow(WorkflowSerializationContext::new());
543 let context = SerializationContext::new(&context_data, &payload_converter);
544 UserMetadata {
545 summary: self.static_summary.as_ref().map(|summary| {
546 payload_converter
547 .to_payload(&context, summary)
548 .expect("String-to-JSON payload serialization is infallible")
549 }),
550 details: self.static_details.as_ref().map(|details| {
551 payload_converter
552 .to_payload(&context, details)
553 .expect("String-to-JSON payload serialization is infallible")
554 }),
555 }
556 })
557 }
558}
559
560#[derive(Debug, Clone, bon::Builder)]
565#[builder(start_fn = new, on(String, into))]
566#[non_exhaustive]
567pub struct WorkflowUpdateWithStartOptions {
568 #[builder(start_fn)]
570 pub task_queue: String,
571
572 #[builder(start_fn)]
574 pub workflow_id: String,
575
576 #[builder(start_fn)]
579 pub id_conflict_policy: WorkflowIdConflictPolicy,
580
581 #[builder(default)]
583 pub id_reuse_policy: WorkflowIdReusePolicy,
584
585 pub execution_timeout: Option<Duration>,
587
588 pub run_timeout: Option<Duration>,
590
591 pub task_timeout: Option<Duration>,
593
594 pub search_attributes: Option<SearchAttributes>,
596
597 #[builder(into)]
599 pub retry_policy: Option<RetryPolicy>,
600
601 #[builder(default)]
603 pub links: Vec<common::v1::Link>,
604
605 #[builder(default)]
607 pub completion_callbacks: Vec<common::v1::Callback>,
608
609 #[builder(default)]
611 pub priority: Priority,
612
613 pub start_header: Option<Header>,
615
616 pub update_header: Option<Header>,
618
619 pub memo: Option<MemoValues>,
621
622 pub static_summary: Option<String>,
624
625 pub static_details: Option<String>,
627
628 pub update_id: Option<String>,
630
631 #[builder(default)]
633 pub rpc_options: RpcOptions,
634}
635
636impl WorkflowUpdateWithStartOptions {
637 pub(crate) fn into_parts(self) -> (WorkflowStartOptions, Option<String>, Option<Header>) {
638 let Self {
639 task_queue,
640 workflow_id,
641 id_conflict_policy,
642 id_reuse_policy,
643 execution_timeout,
644 run_timeout,
645 task_timeout,
646 search_attributes,
647 retry_policy,
648 links,
649 completion_callbacks,
650 priority,
651 start_header,
652 update_header,
653 memo,
654 static_summary,
655 static_details,
656 update_id,
657 rpc_options: _,
658 } = self;
659 (
660 WorkflowStartOptions {
661 task_queue,
662 workflow_id,
663 id_reuse_policy,
664 id_conflict_policy,
665 execution_timeout,
666 run_timeout,
667 task_timeout,
668 cron_schedule: None,
669 search_attributes,
670 enable_eager_workflow_start: false,
671 retry_policy,
672 links,
673 completion_callbacks,
674 priority,
675 header: start_header,
676 memo,
677 static_summary,
678 static_details,
679 rpc_options: RpcOptions::default(),
680 },
681 update_id,
682 update_header,
683 )
684 }
685}
686
687pub use temporalio_common::Priority;
688
689#[derive(Debug, Clone, bon::Builder)]
691#[non_exhaustive]
692pub struct WorkflowGetResultOptions {
693 #[builder(default = true)]
696 pub follow_runs: bool,
697 #[builder(default)]
699 pub rpc_options: RpcOptions,
700}
701impl Default for WorkflowGetResultOptions {
702 fn default() -> Self {
703 Self {
704 follow_runs: true,
705 rpc_options: RpcOptions::default(),
706 }
707 }
708}
709
710#[derive(Debug, Clone, Default, bon::Builder)]
712#[non_exhaustive]
713pub struct WorkflowExecuteUpdateOptions {
714 pub update_id: Option<String>,
716 pub header: Option<Header>,
718 #[builder(default)]
720 pub rpc_options: RpcOptions,
721}
722
723#[derive(Debug, Clone, Default, bon::Builder)]
725#[non_exhaustive]
726pub struct WorkflowSignalOptions {
727 pub request_id: Option<String>,
729 pub header: Option<Header>,
731 #[builder(default)]
733 pub rpc_options: RpcOptions,
734}
735
736#[derive(Debug, Clone, Default, bon::Builder)]
738#[non_exhaustive]
739pub struct WorkflowQueryOptions {
740 pub reject_condition: Option<QueryRejectCondition>,
743 pub header: Option<Header>,
745 #[builder(default)]
747 pub rpc_options: RpcOptions,
748}
749
750#[derive(Debug, Clone, Default, bon::Builder)]
752#[builder(on(String, into))]
753#[non_exhaustive]
754pub struct WorkflowCancelOptions {
755 #[builder(default)]
757 pub reason: String,
758 pub request_id: Option<String>,
760 #[builder(default)]
762 pub rpc_options: RpcOptions,
763}
764
765#[derive(Debug, Clone, Default, bon::Builder)]
767#[builder(on(String, into))]
768#[non_exhaustive]
769pub struct WorkflowTerminateOptions {
770 #[builder(default)]
772 pub reason: String,
773 pub details: Option<Payloads>,
775 #[builder(default)]
777 pub rpc_options: RpcOptions,
778}
779
780#[derive(Debug, Clone, Default, bon::Builder)]
782#[non_exhaustive]
783pub struct WorkflowDescribeOptions {
784 #[builder(default)]
786 pub rpc_options: RpcOptions,
787}
788
789const DEFAULT_WORKFLOW_EXECUTION_RETENTION_PERIOD: Duration = Duration::from_secs(60 * 60 * 24 * 3);
791
792#[derive(Clone, Debug, bon::Builder)]
794#[builder(on(String, into))]
795#[non_exhaustive]
796pub struct RegisterNamespaceOptions {
797 pub namespace: String,
799 pub description: String,
801 #[builder(default)]
803 pub owner_email: String,
804 #[builder(default = DEFAULT_WORKFLOW_EXECUTION_RETENTION_PERIOD)]
806 pub workflow_execution_retention_period: Duration,
807 #[builder(default)]
809 pub clusters: Vec<ClusterReplicationConfig>,
810 #[builder(default)]
812 pub active_cluster_name: String,
813 #[builder(default)]
815 pub data: HashMap<String, String>,
816 #[builder(default)]
818 pub security_token: String,
819 #[builder(default)]
821 pub is_global_namespace: bool,
822 #[builder(default = ArchivalState::Unspecified)]
824 pub history_archival_state: ArchivalState,
825 #[builder(default)]
827 pub history_archival_uri: String,
828 #[builder(default = ArchivalState::Unspecified)]
830 pub visibility_archival_state: ArchivalState,
831 #[builder(default)]
833 pub visibility_archival_uri: String,
834}
835
836impl From<RegisterNamespaceOptions> for RegisterNamespaceRequest {
837 fn from(val: RegisterNamespaceOptions) -> Self {
838 RegisterNamespaceRequest {
839 namespace: val.namespace,
840 description: val.description,
841 owner_email: val.owner_email,
842 workflow_execution_retention_period: val
843 .workflow_execution_retention_period
844 .try_into()
845 .ok(),
846 clusters: val.clusters,
847 active_cluster_name: val.active_cluster_name,
848 data: val.data,
849 security_token: val.security_token,
850 is_global_namespace: val.is_global_namespace,
851 history_archival_state: val.history_archival_state as i32,
852 history_archival_uri: val.history_archival_uri,
853 visibility_archival_state: val.visibility_archival_state as i32,
854 visibility_archival_uri: val.visibility_archival_uri,
855 }
856 }
857}
858
859#[derive(Debug, Clone, Default, bon::Builder)]
861#[non_exhaustive]
862pub struct WorkflowFetchHistoryOptions {
863 #[builder(default)]
865 pub skip_archival: bool,
866 #[builder(default)]
868 pub wait_new_event: bool,
869 #[builder(default = HistoryEventFilterType::AllEvent)]
871 pub event_filter_type: HistoryEventFilterType,
872 #[builder(default)]
874 pub rpc_options: RpcOptions,
875}
876
877#[derive(Debug, Clone, Default, bon::Builder)]
879#[non_exhaustive]
880pub struct WorkflowStartUpdateOptions {
881 pub update_id: Option<String>,
883 pub header: Option<Header>,
885 #[builder(default)]
887 pub rpc_options: RpcOptions,
888}
889
890impl From<WorkflowExecuteUpdateOptions> for WorkflowStartUpdateOptions {
891 fn from(options: WorkflowExecuteUpdateOptions) -> Self {
893 Self::builder()
894 .maybe_update_id(options.update_id)
895 .maybe_header(options.header)
896 .rpc_options(options.rpc_options)
897 .build()
898 }
899}
900
901#[derive(Debug, Clone, Default, bon::Builder)]
903#[non_exhaustive]
904pub struct WorkflowListOptions {
905 pub limit: Option<usize>,
908 #[builder(default)]
910 pub rpc_options: RpcOptions,
911}
912
913#[derive(Debug, Clone, Default, bon::Builder)]
915#[non_exhaustive]
916pub struct WorkflowCountOptions {
917 #[builder(default)]
919 pub rpc_options: RpcOptions,
920}
921
922#[derive(Clone, Debug, bon::Builder)]
924#[builder(start_fn = new, on(String, into))]
925#[non_exhaustive]
926pub struct ActivityStartOptions {
927 #[builder(start_fn)]
929 pub task_queue: String,
930 #[builder(start_fn)]
932 pub id: String,
933 #[builder(start_fn)]
937 pub close_timeouts: ActivityCloseTimeouts,
938 pub schedule_to_start_timeout: Option<Duration>,
941 pub heartbeat_timeout: Option<Duration>,
943 #[builder(into)]
945 pub retry_policy: Option<RetryPolicy>,
946 #[builder(default)]
948 pub priority: Priority,
949 #[builder(default)]
951 pub id_reuse_policy: ActivityIdReusePolicy,
952 #[builder(default)]
955 pub id_conflict_policy: ActivityIdConflictPolicy,
956 pub search_attributes: Option<SearchAttributes>,
958 pub header: Option<Header>,
960 pub summary: Option<String>,
962 pub static_details: Option<String>,
964 pub start_delay: Option<Duration>,
967}
968
969impl ActivityStartOptions {
970 pub fn with_start_to_close_timeout(
972 task_queue: impl Into<String>,
973 activity_id: impl Into<String>,
974 start_to_close_timeout: Duration,
975 ) -> ActivityStartOptionsBuilder {
976 Self::new(
977 task_queue,
978 activity_id,
979 ActivityCloseTimeouts::StartToClose(start_to_close_timeout),
980 )
981 }
982
983 pub fn with_schedule_to_close_timeout(
985 task_queue: impl Into<String>,
986 activity_id: impl Into<String>,
987 schedule_to_close_timeout: Duration,
988 ) -> ActivityStartOptionsBuilder {
989 Self::new(
990 task_queue,
991 activity_id,
992 ActivityCloseTimeouts::ScheduleToClose(schedule_to_close_timeout),
993 )
994 }
995}
996
997#[non_exhaustive]
1000#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
1001pub enum ActivityIdReusePolicy {
1002 #[default]
1003 AllowDuplicate,
1005 AllowDuplicateFailedOnly,
1008 RejectDuplicate,
1010}
1011
1012impl From<ActivityIdReusePolicy> for ProtoActivityIdReusePolicy {
1013 fn from(value: ActivityIdReusePolicy) -> Self {
1014 match value {
1015 ActivityIdReusePolicy::AllowDuplicate => Self::AllowDuplicate,
1016 ActivityIdReusePolicy::AllowDuplicateFailedOnly => Self::AllowDuplicateFailedOnly,
1017 ActivityIdReusePolicy::RejectDuplicate => Self::RejectDuplicate,
1018 }
1019 }
1020}
1021
1022#[non_exhaustive]
1025#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
1026pub enum ActivityIdConflictPolicy {
1027 #[default]
1028 Fail,
1031 UseExisting,
1033}
1034
1035impl From<ActivityIdConflictPolicy> for ProtoActivityIdConflictPolicy {
1036 fn from(value: ActivityIdConflictPolicy) -> Self {
1037 match value {
1038 ActivityIdConflictPolicy::Fail => Self::Fail,
1039 ActivityIdConflictPolicy::UseExisting => Self::UseExisting,
1040 }
1041 }
1042}
1043
1044#[derive(Debug, Clone, Default, bon::Builder)]
1046#[non_exhaustive]
1047pub struct ActivityListOptions {}
1048
1049#[derive(Debug, Clone, Default, bon::Builder)]
1051#[non_exhaustive]
1052pub struct ActivityCountOptions {}
1053
1054#[derive(Debug, Clone, Default, bon::Builder)]
1062#[non_exhaustive]
1063pub struct ActivityDescribeOptions {
1064 #[builder(default)]
1066 pub include_input: bool,
1067 #[builder(default)]
1069 pub include_outcome: bool,
1070 #[builder(default)]
1072 pub include_heartbeat_details: bool,
1073 #[builder(default)]
1075 pub include_last_failure: bool,
1076}
1077
1078#[derive(Debug, Clone, Default, bon::Builder)]
1080#[builder(on(String, into))]
1081#[non_exhaustive]
1082pub struct ActivityCancelOptions {
1083 #[builder(default)]
1085 pub reason: String,
1086}
1087
1088#[derive(Debug, Clone, Default, bon::Builder)]
1090#[builder(on(String, into))]
1091#[non_exhaustive]
1092pub struct ActivityTerminateOptions {
1093 #[builder(default)]
1095 pub reason: String,
1096}