#[allow(unused)]
#[allow(warnings)]
#[rustfmt::skip]
pub mod bindings;
#[cfg(feature = "json")]
mod json;
#[cfg(feature = "json")]
pub use json::*;
#[cfg(feature = "uuid")]
mod uuid;
mod transaction;
use bindings::golem::api::host::*;
pub use bindings::golem::api::host::oplog_commit;
pub use bindings::golem::api::host::PersistenceLevel;
pub use transaction::*;
pub use golem_rust_macro::*;
#[derive(Clone, Debug, PartialEq)]
pub struct RetryPolicy {
pub max_attempts: u32,
pub min_delay: std::time::Duration,
pub max_delay: std::time::Duration,
pub multiplier: f64,
pub max_jitter_factory: Option<f64>,
}
impl From<bindings::golem::api::host::RetryPolicy> for RetryPolicy {
fn from(value: bindings::golem::api::host::RetryPolicy) -> Self {
Self {
max_attempts: value.max_attempts,
min_delay: std::time::Duration::from_nanos(value.min_delay),
max_delay: std::time::Duration::from_nanos(value.max_delay),
multiplier: value.multiplier,
max_jitter_factory: value.max_jitter_factor,
}
}
}
impl From<RetryPolicy> for bindings::golem::api::host::RetryPolicy {
fn from(val: RetryPolicy) -> Self {
bindings::golem::api::host::RetryPolicy {
max_attempts: val.max_attempts,
min_delay: val.min_delay.as_nanos() as u64,
max_delay: val.max_delay.as_nanos() as u64,
multiplier: val.multiplier,
max_jitter_factor: val.max_jitter_factory,
}
}
}
pub struct PersistenceLevelGuard {
original_level: PersistenceLevel,
}
impl Drop for PersistenceLevelGuard {
fn drop(&mut self) {
set_oplog_persistence_level(self.original_level);
}
}
#[must_use]
pub fn use_persistence_level(level: PersistenceLevel) -> PersistenceLevelGuard {
let original_level = get_oplog_persistence_level();
set_oplog_persistence_level(level);
PersistenceLevelGuard { original_level }
}
pub fn with_persistence_level<R>(level: PersistenceLevel, f: impl FnOnce() -> R) -> R {
let _guard = use_persistence_level(level);
f()
}
pub struct IdempotenceModeGuard {
original: bool,
}
impl Drop for IdempotenceModeGuard {
fn drop(&mut self) {
set_idempotence_mode(self.original);
}
}
#[must_use]
pub fn use_idempotence_mode(mode: bool) -> IdempotenceModeGuard {
let original = get_idempotence_mode();
set_idempotence_mode(mode);
IdempotenceModeGuard { original }
}
pub fn with_idempotence_mode<R>(mode: bool, f: impl FnOnce() -> R) -> R {
let _guard = use_idempotence_mode(mode);
f()
}
#[cfg(feature = "uuid")]
pub fn generate_idempotency_key() -> ::uuid::Uuid {
Into::into(bindings::golem::api::host::generate_idempotency_key())
}
#[cfg(not(feature = "uuid"))]
pub fn generate_idempotency_key() -> Uuid {
bindings::golem::api::host::generate_idempotency_key()
}
pub struct RetryPolicyGuard {
original: RetryPolicy,
}
impl Drop for RetryPolicyGuard {
fn drop(&mut self) {
set_retry_policy(Into::into(self.original.clone()));
}
}
#[must_use]
pub fn use_retry_policy(policy: RetryPolicy) -> RetryPolicyGuard {
let original = Into::into(get_retry_policy());
set_retry_policy(Into::into(policy));
RetryPolicyGuard { original }
}
pub fn with_retry_policy<R>(policy: RetryPolicy, f: impl FnOnce() -> R) -> R {
let _guard = use_retry_policy(policy);
f()
}
pub struct AtomicOperationGuard {
begin: OplogIndex,
}
impl Drop for AtomicOperationGuard {
fn drop(&mut self) {
mark_end_operation(self.begin);
}
}
#[must_use]
pub fn mark_atomic_operation() -> AtomicOperationGuard {
let begin = mark_begin_operation();
AtomicOperationGuard { begin }
}
pub fn atomically<T>(f: impl FnOnce() -> T) -> T {
let _guard = mark_atomic_operation();
f()
}