#[cfg(test)]
test_r::enable!();
pub use uuid::Uuid;
pub use wasip2;
pub use wstd;
pub mod bindings {
use wit_bindgen::generate;
generate!({
path: "wit",
world: "golem-rust",
generate_all,
generate_unused_types: true,
pub_export_macro: true,
with: {
"golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
"wasi:io/poll@0.2.3": wasip2::io::poll,
"wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
}
});
}
#[cfg(feature = "export_load_snapshot")]
pub mod load_snapshot {
use wit_bindgen::generate;
generate!({
path: "wit",
world: "golem-rust-load-snapshot",
generate_all,
generate_unused_types: true,
pub_export_macro: true,
with: {
"golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
"wasi:io/poll@0.2.3": wasip2::io::poll,
"wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
"golem:api/host@1.5.0": crate::bindings::golem::api::host,
"golem:api/retry@1.5.0": crate::bindings::golem::api::retry,
"golem:api/oplog@1.5.0": crate::bindings::golem::api::oplog,
"golem:api/context@1.5.0": crate::bindings::golem::api::context,
"golem:durability/durability@1.5.0": crate::bindings::golem::durability::durability,
"golem:quota/types@1.5.0": crate::bindings::golem::quota::types,
"golem:rdbms/mysql@1.5.0": crate::bindings::golem::rdbms::mysql,
"golem:rdbms/postgres@1.5.0": crate::bindings::golem::rdbms::postgres,
"golem:rdbms/types@1.5.0": crate::bindings::golem::rdbms::types,
"wasi:blobstore/blobstore": crate::bindings::wasi::blobstore::blobstore,
"wasi:blobstore/container": crate::bindings::wasi::blobstore::container,
"wasi:blobstore/types": crate::bindings::wasi::blobstore::types,
"wasi:keyvalue/eventual-batch@0.1.0": crate::bindings::wasi::keyvalue::eventual_batch,
"wasi:keyvalue/eventual@0.1.0": crate::bindings::wasi::keyvalue::eventual,
"wasi:keyvalue/types@0.1.0": crate::bindings::wasi::keyvalue::types,
"wasi:keyvalue/wasi-keyvalue-error@0.1.0": crate::bindings::wasi::keyvalue::wasi_keyvalue_error,
"wasi:logging/logging": crate::bindings::wasi::logging::logging,
}
});
pub use __export_golem_rust_load_snapshot_impl as export_load_snapshot;
}
#[cfg(feature = "export_save_snapshot")]
pub mod save_snapshot {
use wit_bindgen::generate;
generate!({
path: "wit",
world: "golem-rust-save-snapshot",
generate_all,
generate_unused_types: true,
pub_export_macro: true,
with: {
"golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
"wasi:io/poll@0.2.3": wasip2::io::poll,
"wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
"golem:api/host@1.5.0": crate::bindings::golem::api::host,
"golem:api/retry@1.5.0": crate::bindings::golem::api::retry,
"golem:api/oplog@1.5.0": crate::bindings::golem::api::oplog,
"golem:api/context@1.5.0": crate::bindings::golem::api::context,
"golem:durability/durability@1.5.0": crate::bindings::golem::durability::durability,
"golem:quota/types@1.5.0": crate::bindings::golem::quota::types,
"golem:rdbms/mysql@1.5.0": crate::bindings::golem::rdbms::mysql,
"golem:rdbms/postgres@1.5.0": crate::bindings::golem::rdbms::postgres,
"golem:rdbms/types@1.5.0": crate::bindings::golem::rdbms::types,
"wasi:blobstore/blobstore": crate::bindings::wasi::blobstore::blobstore,
"wasi:blobstore/container": crate::bindings::wasi::blobstore::container,
"wasi:blobstore/types": crate::bindings::wasi::blobstore::types,
"wasi:keyvalue/eventual-batch@0.1.0": crate::bindings::wasi::keyvalue::eventual_batch,
"wasi:keyvalue/eventual@0.1.0": crate::bindings::wasi::keyvalue::eventual,
"wasi:keyvalue/types@0.1.0": crate::bindings::wasi::keyvalue::types,
"wasi:keyvalue/wasi-keyvalue-error@0.1.0": crate::bindings::wasi::keyvalue::wasi_keyvalue_error,
"wasi:logging/logging": crate::bindings::wasi::logging::logging,
}
});
pub use __export_golem_rust_save_snapshot_impl as export_save_snapshot;
}
#[cfg(feature = "export_golem_agentic")]
pub mod golem_agentic {
use wit_bindgen::generate;
generate!({
path: "wit",
world: "golem-agentic",
generate_all,
generate_unused_types: true,
pub_export_macro: true,
with: {
"golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
"wasi:io/poll@0.2.3": wasip2::io::poll,
"wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
"golem:api/host@1.5.0": crate::bindings::golem::api::host,
"golem:api/retry@1.5.0": crate::bindings::golem::api::retry,
"golem:api/oplog@1.5.0": crate::bindings::golem::api::oplog,
"golem:api/context@1.5.0": crate::bindings::golem::api::context,
"golem:durability/durability@1.5.0": crate::bindings::golem::durability::durability,
"golem:quota/types@1.5.0": crate::bindings::golem::quota::types,
"golem:rdbms/mysql@1.5.0": crate::bindings::golem::rdbms::mysql,
"golem:rdbms/postgres@1.5.0": crate::bindings::golem::rdbms::postgres,
"golem:rdbms/types@1.5.0": crate::bindings::golem::rdbms::types,
"wasi:blobstore/blobstore": crate::bindings::wasi::blobstore::blobstore,
"wasi:blobstore/container": crate::bindings::wasi::blobstore::container,
"wasi:blobstore/types": crate::bindings::wasi::blobstore::types,
"wasi:keyvalue/eventual-batch@0.1.0": crate::bindings::wasi::keyvalue::eventual_batch,
"wasi:keyvalue/eventual@0.1.0": crate::bindings::wasi::keyvalue::eventual,
"wasi:keyvalue/types@0.1.0": crate::bindings::wasi::keyvalue::types,
"wasi:keyvalue/wasi-keyvalue-error@0.1.0": crate::bindings::wasi::keyvalue::wasi_keyvalue_error,
"wasi:logging/logging": crate::bindings::wasi::logging::logging,
}
});
pub use __export_golem_agentic_impl as export_golem_agentic;
}
#[cfg(feature = "export_golem_agentic")]
pub use ctor;
#[cfg(feature = "export_golem_agentic")]
pub use async_trait;
#[cfg(feature = "export_golem_agentic")]
pub use serde;
#[cfg(feature = "export_golem_agentic")]
pub use serde_json;
#[cfg(feature = "export_oplog_processor")]
pub mod oplog_processor {
use wit_bindgen::generate;
generate!({
path: "wit",
world: "golem-rust-oplog-processor",
generate_all,
generate_unused_types: true,
pub_export_macro: true,
with: {
"golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
"wasi:io/poll@0.2.3": wasip2::io::poll,
"wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
"golem:api/host@1.5.0": crate::bindings::golem::api::host,
"golem:api/retry@1.5.0": crate::bindings::golem::api::retry,
"golem:api/oplog@1.5.0": crate::bindings::golem::api::oplog,
"golem:api/context@1.5.0": crate::bindings::golem::api::context,
"golem:durability/durability@1.5.0": crate::bindings::golem::durability::durability,
"golem:quota/types@1.5.0": crate::bindings::golem::quota::types,
"golem:rdbms/mysql@1.5.0": crate::bindings::golem::rdbms::mysql,
"golem:rdbms/postgres@1.5.0": crate::bindings::golem::rdbms::postgres,
"golem:rdbms/types@1.5.0": crate::bindings::golem::rdbms::types,
"wasi:blobstore/blobstore": crate::bindings::wasi::blobstore::blobstore,
"wasi:blobstore/container": crate::bindings::wasi::blobstore::container,
"wasi:blobstore/types": crate::bindings::wasi::blobstore::types,
"wasi:keyvalue/eventual-batch@0.1.0": crate::bindings::wasi::keyvalue::eventual_batch,
"wasi:keyvalue/eventual@0.1.0": crate::bindings::wasi::keyvalue::eventual,
"wasi:keyvalue/types@0.1.0": crate::bindings::wasi::keyvalue::types,
"wasi:keyvalue/wasi-keyvalue-error@0.1.0": crate::bindings::wasi::keyvalue::wasi_keyvalue_error,
"wasi:logging/logging": crate::bindings::wasi::logging::logging,
}
});
pub use __export_golem_rust_oplog_processor_impl as export_oplog_processor;
}
#[cfg(feature = "export_golem_agentic")]
pub mod agentic;
#[cfg(feature = "durability")]
pub mod durability;
#[cfg(feature = "json")]
mod json;
#[cfg(feature = "json")]
pub use json::*;
mod checkpoint;
pub mod quota;
mod transaction;
pub mod value_and_type;
use std::future::Future;
use bindings::golem::api::host::*;
pub use golem_wasm;
pub use bindings::golem::api::host::{ForkResult, PersistenceLevel, PromiseId};
pub use bindings::golem::api::host::{
complete_promise, create_promise, fork, get_promise, oplog_commit,
};
pub use bindings::golem::websocket::client::{
CloseInfo as WebSocketCloseInfo, Error as WebSocketError, Message as WebSocketMessage,
WebsocketConnection,
};
pub use checkpoint::*;
pub use quota::*;
pub use transaction::*;
#[cfg(feature = "macro")]
pub use golem_rust_macro::*;
pub fn blocking_await_promise(promise_id: &PromiseId) -> Vec<u8> {
let promise = get_promise(promise_id);
let pollable = promise.subscribe();
pollable.block();
promise.get().unwrap()
}
pub async fn await_promise(promise_id: &PromiseId) -> Vec<u8> {
let promise = get_promise(promise_id);
let pollable = promise.subscribe();
wstd::io::AsyncPollable::new(pollable).wait_for().await;
promise.get().unwrap()
}
pub mod retry {
use crate::bindings::golem::api::retry as retry_api;
pub use retry_api::{NamedRetryPolicy, PredicateValue, RetryPolicy, RetryPredicate};
pub fn get_retry_policies() -> Vec<NamedRetryPolicy> {
retry_api::get_retry_policies()
}
pub fn get_retry_policy_by_name(name: &str) -> Option<NamedRetryPolicy> {
retry_api::get_retry_policy_by_name(name)
}
pub fn resolve_retry_policy(
verb: &str,
noun_uri: &str,
properties: &[(String, PredicateValue)],
) -> Option<RetryPolicy> {
let props: Vec<(String, PredicateValue)> = properties.to_vec();
retry_api::resolve_retry_policy(verb, noun_uri, &props)
}
pub fn set_retry_policy(policy: &NamedRetryPolicy) {
retry_api::set_retry_policy(policy);
}
pub fn remove_retry_policy(name: &str) {
retry_api::remove_retry_policy(name);
}
pub struct RetryPolicyGuard {
previous: Option<NamedRetryPolicy>,
name: String,
}
impl Drop for RetryPolicyGuard {
fn drop(&mut self) {
match self.previous.take() {
Some(original) => set_retry_policy(&original),
None => remove_retry_policy(&self.name),
}
}
}
#[must_use]
pub fn use_retry_policy(policy: NamedRetryPolicy) -> RetryPolicyGuard {
let previous = get_retry_policy_by_name(&policy.name);
let name = policy.name.clone();
set_retry_policy(&policy);
RetryPolicyGuard { previous, name }
}
pub fn with_retry_policy<R>(policy: NamedRetryPolicy, f: impl FnOnce() -> R) -> R {
let _guard = use_retry_policy(policy);
f()
}
pub async fn with_retry_policy_async<R, F: std::future::Future<Output = R>>(
policy: NamedRetryPolicy,
f: impl FnOnce() -> F,
) -> R {
let _guard = use_retry_policy(policy);
f().await
}
}
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 async fn with_persistence_level_async<R, F: Future<Output = R>>(
level: PersistenceLevel,
f: impl FnOnce() -> F,
) -> R {
let _guard = use_persistence_level(level);
f().await
}
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()
}
pub async fn with_idempotence_mode_async<R, F: Future<Output = R>>(
mode: bool,
f: impl FnOnce() -> F,
) -> R {
let _guard = use_idempotence_mode(mode);
f().await
}
pub fn generate_idempotency_key() -> uuid::Uuid {
Into::into(bindings::golem::api::host::generate_idempotency_key())
}
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()
}
pub async fn atomically_async<T, F: Future<Output = T>>(f: impl FnOnce() -> F) -> T {
let _guard = mark_atomic_operation();
f().await
}