1#[cfg(test)]
16test_r::enable!();
17
18pub use uuid::Uuid;
19pub use wasip2;
20pub use wstd;
21
22pub mod bindings {
23 use wit_bindgen::generate;
24
25 generate!({
26 path: "wit",
27 world: "golem-rust",
28 generate_all,
29 generate_unused_types: true,
30 pub_export_macro: true,
31 with: {
32 "golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
33 "wasi:io/poll@0.2.3": wasip2::io::poll,
34 "wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
35 }
36 });
37}
38
39#[cfg(feature = "export_load_snapshot")]
40pub mod load_snapshot {
41 use wit_bindgen::generate;
42
43 generate!({
44 path: "wit",
45 world: "golem-rust-load-snapshot",
46 generate_all,
47 generate_unused_types: true,
48 pub_export_macro: true,
49 with: {
50 "golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
51 "wasi:io/poll@0.2.3": wasip2::io::poll,
52 "wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
53
54 "golem:api/host@1.5.0": crate::bindings::golem::api::host,
55 "golem:api/retry@1.5.0": crate::bindings::golem::api::retry,
56 "golem:api/oplog@1.5.0": crate::bindings::golem::api::oplog,
57 "golem:api/context@1.5.0": crate::bindings::golem::api::context,
58 "golem:durability/durability@1.5.0": crate::bindings::golem::durability::durability,
59 "golem:quota/types@1.5.0": crate::bindings::golem::quota::types,
60 "golem:rdbms/mysql@1.5.0": crate::bindings::golem::rdbms::mysql,
61 "golem:rdbms/postgres@1.5.0": crate::bindings::golem::rdbms::postgres,
62 "golem:rdbms/types@1.5.0": crate::bindings::golem::rdbms::types,
63 "wasi:blobstore/blobstore": crate::bindings::wasi::blobstore::blobstore,
64 "wasi:blobstore/container": crate::bindings::wasi::blobstore::container,
65 "wasi:blobstore/types": crate::bindings::wasi::blobstore::types,
66 "wasi:keyvalue/eventual-batch@0.1.0": crate::bindings::wasi::keyvalue::eventual_batch,
67 "wasi:keyvalue/eventual@0.1.0": crate::bindings::wasi::keyvalue::eventual,
68 "wasi:keyvalue/types@0.1.0": crate::bindings::wasi::keyvalue::types,
69 "wasi:keyvalue/wasi-keyvalue-error@0.1.0": crate::bindings::wasi::keyvalue::wasi_keyvalue_error,
70 "wasi:logging/logging": crate::bindings::wasi::logging::logging,
71 }
72 });
73
74 pub use __export_golem_rust_load_snapshot_impl as export_load_snapshot;
75}
76
77#[cfg(feature = "export_save_snapshot")]
78pub mod save_snapshot {
79 use wit_bindgen::generate;
80
81 generate!({
82 path: "wit",
83 world: "golem-rust-save-snapshot",
84 generate_all,
85 generate_unused_types: true,
86 pub_export_macro: true,
87 with: {
88 "golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
89 "wasi:io/poll@0.2.3": wasip2::io::poll,
90 "wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
91
92 "golem:api/host@1.5.0": crate::bindings::golem::api::host,
93 "golem:api/retry@1.5.0": crate::bindings::golem::api::retry,
94 "golem:api/oplog@1.5.0": crate::bindings::golem::api::oplog,
95 "golem:api/context@1.5.0": crate::bindings::golem::api::context,
96 "golem:durability/durability@1.5.0": crate::bindings::golem::durability::durability,
97 "golem:quota/types@1.5.0": crate::bindings::golem::quota::types,
98 "golem:rdbms/mysql@1.5.0": crate::bindings::golem::rdbms::mysql,
99 "golem:rdbms/postgres@1.5.0": crate::bindings::golem::rdbms::postgres,
100 "golem:rdbms/types@1.5.0": crate::bindings::golem::rdbms::types,
101 "wasi:blobstore/blobstore": crate::bindings::wasi::blobstore::blobstore,
102 "wasi:blobstore/container": crate::bindings::wasi::blobstore::container,
103 "wasi:blobstore/types": crate::bindings::wasi::blobstore::types,
104 "wasi:keyvalue/eventual-batch@0.1.0": crate::bindings::wasi::keyvalue::eventual_batch,
105 "wasi:keyvalue/eventual@0.1.0": crate::bindings::wasi::keyvalue::eventual,
106 "wasi:keyvalue/types@0.1.0": crate::bindings::wasi::keyvalue::types,
107 "wasi:keyvalue/wasi-keyvalue-error@0.1.0": crate::bindings::wasi::keyvalue::wasi_keyvalue_error,
108 "wasi:logging/logging": crate::bindings::wasi::logging::logging,
109 }
110 });
111
112 pub use __export_golem_rust_save_snapshot_impl as export_save_snapshot;
113}
114
115#[cfg(feature = "export_golem_agentic")]
116pub mod golem_agentic {
117 use wit_bindgen::generate;
118
119 generate!({
120 path: "wit",
121 world: "golem-agentic",
122 generate_all,
123 generate_unused_types: true,
124 pub_export_macro: true,
125
126 with: {
127 "golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
128 "wasi:io/poll@0.2.3": wasip2::io::poll,
129 "wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
130
131 "golem:api/host@1.5.0": crate::bindings::golem::api::host,
132 "golem:api/retry@1.5.0": crate::bindings::golem::api::retry,
133 "golem:api/oplog@1.5.0": crate::bindings::golem::api::oplog,
134 "golem:api/context@1.5.0": crate::bindings::golem::api::context,
135 "golem:durability/durability@1.5.0": crate::bindings::golem::durability::durability,
136 "golem:quota/types@1.5.0": crate::bindings::golem::quota::types,
137 "golem:rdbms/mysql@1.5.0": crate::bindings::golem::rdbms::mysql,
138 "golem:rdbms/postgres@1.5.0": crate::bindings::golem::rdbms::postgres,
139 "golem:rdbms/types@1.5.0": crate::bindings::golem::rdbms::types,
140 "wasi:blobstore/blobstore": crate::bindings::wasi::blobstore::blobstore,
141 "wasi:blobstore/container": crate::bindings::wasi::blobstore::container,
142 "wasi:blobstore/types": crate::bindings::wasi::blobstore::types,
143 "wasi:keyvalue/eventual-batch@0.1.0": crate::bindings::wasi::keyvalue::eventual_batch,
144 "wasi:keyvalue/eventual@0.1.0": crate::bindings::wasi::keyvalue::eventual,
145 "wasi:keyvalue/types@0.1.0": crate::bindings::wasi::keyvalue::types,
146 "wasi:keyvalue/wasi-keyvalue-error@0.1.0": crate::bindings::wasi::keyvalue::wasi_keyvalue_error,
147 "wasi:logging/logging": crate::bindings::wasi::logging::logging,
148 }
149 });
150
151 pub use __export_golem_agentic_impl as export_golem_agentic;
152}
153
154#[cfg(feature = "export_golem_agentic")]
155pub use ctor;
156
157#[cfg(feature = "export_golem_agentic")]
158pub use async_trait;
159
160#[cfg(feature = "export_golem_agentic")]
161pub use serde;
162
163#[cfg(feature = "export_golem_agentic")]
164pub use serde_json;
165
166#[cfg(feature = "export_oplog_processor")]
167pub mod oplog_processor {
168 use wit_bindgen::generate;
169
170 generate!({
171 path: "wit",
172 world: "golem-rust-oplog-processor",
173 generate_all,
174 generate_unused_types: true,
175 pub_export_macro: true,
176 with: {
177 "golem:core/types@1.5.0": golem_wasm::golem_core_1_5_x::types,
178 "wasi:io/poll@0.2.3": wasip2::io::poll,
179 "wasi:clocks/wall-clock@0.2.3": wasip2::clocks::wall_clock,
180
181 "golem:api/host@1.5.0": crate::bindings::golem::api::host,
182 "golem:api/retry@1.5.0": crate::bindings::golem::api::retry,
183 "golem:api/oplog@1.5.0": crate::bindings::golem::api::oplog,
184 "golem:api/context@1.5.0": crate::bindings::golem::api::context,
185 "golem:durability/durability@1.5.0": crate::bindings::golem::durability::durability,
186 "golem:quota/types@1.5.0": crate::bindings::golem::quota::types,
187 "golem:rdbms/mysql@1.5.0": crate::bindings::golem::rdbms::mysql,
188 "golem:rdbms/postgres@1.5.0": crate::bindings::golem::rdbms::postgres,
189 "golem:rdbms/types@1.5.0": crate::bindings::golem::rdbms::types,
190 "wasi:blobstore/blobstore": crate::bindings::wasi::blobstore::blobstore,
191 "wasi:blobstore/container": crate::bindings::wasi::blobstore::container,
192 "wasi:blobstore/types": crate::bindings::wasi::blobstore::types,
193 "wasi:keyvalue/eventual-batch@0.1.0": crate::bindings::wasi::keyvalue::eventual_batch,
194 "wasi:keyvalue/eventual@0.1.0": crate::bindings::wasi::keyvalue::eventual,
195 "wasi:keyvalue/types@0.1.0": crate::bindings::wasi::keyvalue::types,
196 "wasi:keyvalue/wasi-keyvalue-error@0.1.0": crate::bindings::wasi::keyvalue::wasi_keyvalue_error,
197 "wasi:logging/logging": crate::bindings::wasi::logging::logging,
198 }
199 });
200
201 pub use __export_golem_rust_oplog_processor_impl as export_oplog_processor;
202}
203
204#[cfg(feature = "export_golem_agentic")]
205pub mod agentic;
206
207#[cfg(feature = "durability")]
208pub mod durability;
209
210#[cfg(feature = "json")]
211mod json;
212
213#[cfg(feature = "json")]
214pub use json::*;
215
216mod checkpoint;
217pub mod quota;
218mod transaction;
219pub mod value_and_type;
220
221use std::future::Future;
222
223use bindings::golem::api::host::*;
224
225pub use golem_wasm;
226
227pub use bindings::golem::api::host::{ForkResult, PersistenceLevel, PromiseId};
228pub use bindings::golem::api::host::{
229 complete_promise, create_promise, fork, get_promise, oplog_commit,
230};
231
232pub mod websocket;
233pub use checkpoint::*;
234pub use quota::*;
235pub mod retry;
236pub use transaction::*;
237pub use websocket::{WebSocketCloseInfo, WebSocketError, WebSocketMessage, WebsocketConnection};
238
239#[cfg(feature = "macro")]
240pub use golem_rust_macro::*;
241
242pub fn blocking_await_promise(promise_id: &PromiseId) -> Vec<u8> {
248 let promise = get_promise(promise_id);
249 let pollable = promise.subscribe();
250 pollable.block();
251 promise.get().unwrap()
252}
253
254pub async fn await_promise(promise_id: &PromiseId) -> Vec<u8> {
259 let promise = get_promise(promise_id);
260 let pollable = promise.subscribe();
261 wstd::io::AsyncPollable::new(pollable).wait_for().await;
262 promise.get().unwrap()
263}
264
265pub struct PersistenceLevelGuard {
266 original_level: PersistenceLevel,
267}
268
269impl Drop for PersistenceLevelGuard {
270 fn drop(&mut self) {
271 set_oplog_persistence_level(self.original_level);
272 }
273}
274
275#[must_use]
279pub fn use_persistence_level(level: PersistenceLevel) -> PersistenceLevelGuard {
280 let original_level = get_oplog_persistence_level();
281 set_oplog_persistence_level(level);
282 PersistenceLevelGuard { original_level }
283}
284
285pub fn with_persistence_level<R>(level: PersistenceLevel, f: impl FnOnce() -> R) -> R {
287 let _guard = use_persistence_level(level);
288 f()
289}
290
291pub async fn with_persistence_level_async<R, F: Future<Output = R>>(
293 level: PersistenceLevel,
294 f: impl FnOnce() -> F,
295) -> R {
296 let _guard = use_persistence_level(level);
297 f().await
298}
299
300pub struct IdempotenceModeGuard {
301 original: bool,
302}
303
304impl Drop for IdempotenceModeGuard {
305 fn drop(&mut self) {
306 set_idempotence_mode(self.original);
307 }
308}
309
310#[must_use]
314pub fn use_idempotence_mode(mode: bool) -> IdempotenceModeGuard {
315 let original = get_idempotence_mode();
316 set_idempotence_mode(mode);
317 IdempotenceModeGuard { original }
318}
319
320pub fn with_idempotence_mode<R>(mode: bool, f: impl FnOnce() -> R) -> R {
322 let _guard = use_idempotence_mode(mode);
323 f()
324}
325
326pub async fn with_idempotence_mode_async<R, F: Future<Output = R>>(
328 mode: bool,
329 f: impl FnOnce() -> F,
330) -> R {
331 let _guard = use_idempotence_mode(mode);
332 f().await
333}
334
335pub fn generate_idempotency_key() -> uuid::Uuid {
339 Into::into(bindings::golem::api::host::generate_idempotency_key())
340}
341
342pub struct AtomicOperationGuard {
343 begin: OplogIndex,
344}
345
346impl Drop for AtomicOperationGuard {
347 fn drop(&mut self) {
348 mark_end_operation(self.begin);
349 }
350}
351
352#[must_use]
357pub fn mark_atomic_operation() -> AtomicOperationGuard {
358 let begin = mark_begin_operation();
359 AtomicOperationGuard { begin }
360}
361
362pub fn atomically<T>(f: impl FnOnce() -> T) -> T {
366 let _guard = mark_atomic_operation();
367 f()
368}
369
370pub async fn atomically_async<T, F: Future<Output = T>>(f: impl FnOnce() -> F) -> T {
374 let _guard = mark_atomic_operation();
375 f().await
376}