Skip to main content

iii_sdk/
lib.rs

1pub mod channels;
2pub mod error;
3pub mod iii;
4pub mod logger;
5pub mod protocol;
6pub mod stream;
7#[cfg(feature = "otel")]
8pub mod telemetry;
9pub mod triggers;
10pub mod types;
11
12pub use channels::{
13    ChannelDirection, ChannelItem, ChannelReader, ChannelWriter, StreamChannelRef,
14    extract_channel_refs, is_channel_ref,
15};
16pub use error::IIIError;
17pub use iii::{
18    FunctionInfo, FunctionRef, FunctionsAvailableGuard, III, IIIAsyncFn, IIIConnectionState, IIIFn,
19    IntoFunctionHandler, IntoFunctionRegistration, RegisterFunction, TriggerInfo, WorkerInfo,
20    WorkerMetadata, iii_async_fn, iii_fn,
21};
22pub use logger::Logger;
23pub use protocol::{
24    EnqueueResult, ErrorBody, FunctionMessage, HttpAuthConfig, HttpInvocationConfig, HttpMethod,
25    Message, RegisterFunctionMessage, RegisterServiceMessage, RegisterTriggerInput,
26    RegisterTriggerMessage, RegisterTriggerTypeMessage, TriggerAction, TriggerRequest,
27};
28pub use stream::{Streams, UpdateBuilder};
29pub use triggers::{Trigger, TriggerConfig, TriggerHandler};
30pub use types::{
31    ApiRequest, ApiResponse, Channel, FieldPath, StreamUpdateInput, UpdateOp, UpdateResult,
32};
33
34pub use serde_json::Value;
35
36/// Configuration options passed to [`register_worker`].
37///
38/// # Examples
39/// ```rust,no_run
40/// use iii_sdk::{register_worker, InitOptions};
41///
42/// let iii = register_worker("ws://localhost:49134", InitOptions::default());
43/// ```
44#[derive(Debug, Clone, Default)]
45pub struct InitOptions {
46    /// Custom worker metadata. Auto-detected if `None`.
47    pub metadata: Option<WorkerMetadata>,
48    /// OpenTelemetry configuration. Requires the `otel` feature.
49    #[cfg(feature = "otel")]
50    pub otel: Option<crate::telemetry::types::OtelConfig>,
51}
52
53/// Create and return a connected SDK instance. The WebSocket connection is
54/// established automatically in a background Tokio task.
55///
56/// # Arguments
57/// * `address` - WebSocket URL of the III engine (e.g. `ws://localhost:49134`).
58/// * `options` - Configuration for worker metadata and OTel.
59///
60/// # Errors
61/// Returns [`IIIError::Runtime`] if no active Tokio runtime is found.
62///
63/// # Examples
64/// ```rust,no_run
65/// use iii_sdk::{register_worker, InitOptions};
66///
67/// let iii = register_worker("ws://localhost:49134", InitOptions::default());
68/// ```
69pub fn register_worker(address: &str, options: InitOptions) -> III {
70    let InitOptions {
71        metadata,
72        #[cfg(feature = "otel")]
73        otel,
74    } = options;
75
76    let iii = if let Some(metadata) = metadata {
77        III::with_metadata(address, metadata)
78    } else {
79        III::new(address)
80    };
81
82    #[cfg(feature = "otel")]
83    if let Some(cfg) = otel {
84        iii.set_otel_config(cfg);
85    }
86
87    if let Err(err) = tokio::runtime::Handle::try_current() {
88        panic!(
89            "iii_sdk::register_worker requires an active Tokio runtime: {}",
90            err
91        );
92    }
93
94    iii.connect();
95
96    iii
97}
98
99// OpenTelemetry re-exports (behind "otel" feature flag)
100#[cfg(feature = "otel")]
101pub use telemetry::{
102    context::{
103        current_span_id, current_trace_id, extract_baggage, extract_context, extract_traceparent,
104        get_all_baggage, get_baggage_entry, inject_baggage, inject_traceparent,
105        remove_baggage_entry, set_baggage_entry,
106    },
107    flush_otel, get_meter, get_tracer,
108    http_instrumentation::execute_traced_request,
109    init_otel, is_initialized, shutdown_otel,
110    types::OtelConfig,
111    types::ReconnectionConfig,
112    with_span,
113};
114
115// Re-export commonly used OpenTelemetry types for convenience
116#[cfg(feature = "otel")]
117pub use opentelemetry::trace::SpanKind;
118#[cfg(feature = "otel")]
119pub use opentelemetry::trace::Status as SpanStatus;