Skip to main content

ash_flare/python/
mod.rs

1//! Python bindings for ash-flare using PyO3
2//!
3//! This module provides comprehensive Python bindings for the ash-flare supervision library.
4//! The bindings are organized into several submodules:
5//!
6//! - `types` - Basic restart and child types
7//! - `context` - WorkerContext for stateful workers
8//! - `mailbox` - Message-passing system
9//! - `worker` - Worker implementation
10//! - `supervisor` - Regular supervisor
11//! - `stateful` - Stateful supervisor with shared context
12//! - `distributed` - Distributed supervision over TCP/Unix sockets
13
14use pyo3::prelude::*;
15use std::sync::OnceLock;
16
17mod context;
18mod distributed;
19mod mailbox;
20mod stateful;
21mod supervisor;
22mod types;
23mod worker;
24
25// Re-export public types for use by submodules
26pub(crate) use context::*;
27pub(crate) use distributed::*;
28pub(crate) use mailbox::*;
29pub(crate) use stateful::*;
30pub(crate) use supervisor::*;
31pub(crate) use types::*;
32
33// Global tokio runtime for Python bindings
34static TOKIO_RUNTIME: OnceLock<tokio::runtime::Runtime> = OnceLock::new();
35
36#[allow(clippy::expect_used)]
37pub(crate) fn get_runtime() -> &'static tokio::runtime::Runtime {
38    TOKIO_RUNTIME
39        .get_or_init(|| tokio::runtime::Runtime::new().expect("Failed to create tokio runtime"))
40}
41
42/// Python module definition
43#[pymodule]
44fn ash_flare(m: &Bound<'_, PyModule>) -> PyResult<()> {
45    // Restart types
46    m.add_class::<PyRestartPolicy>()?;
47    m.add_class::<PyRestartStrategy>()?;
48    m.add_class::<PyRestartIntensity>()?;
49
50    // Child types
51    m.add_class::<PyChildType>()?;
52    m.add_class::<PyChildExitReason>()?;
53    m.add_class::<PyChildInfo>()?;
54
55    // WorkerContext for stateful workers
56    m.add_class::<PyWorkerContext>()?;
57
58    // Mailbox system
59    m.add_class::<PyMailboxConfig>()?;
60    m.add_class::<PyMailboxHandle>()?;
61    m.add_class::<PyMailbox>()?;
62    m.add_function(wrap_pyfunction!(mailbox::mailbox, m)?)?;
63    m.add_function(wrap_pyfunction!(mailbox::mailbox_named, m)?)?;
64
65    // Regular supervisor
66    m.add_class::<PySupervisorSpec>()?;
67    m.add_class::<PySupervisorHandle>()?;
68
69    // Stateful supervisor
70    m.add_class::<PyStatefulSupervisorSpec>()?;
71    m.add_class::<PyStatefulSupervisorHandle>()?;
72
73    // Distributed supervision
74    m.add_class::<PySupervisorAddress>()?;
75    m.add_class::<PyRemoteSupervisorHandle>()?;
76
77    Ok(())
78}