1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//! A pure-Rust actor framework built on top of the [Tokio](https://tokio.rs) async runtime,
//! inspired by Alice Ryhl's [Actors with Tokio](https://ryhl.io/blog/actors-with-tokio/).
//!
//! `acktor` builds on the patterns described in Alice Ryhl's blog post and extends them into a
//! structured library. Each actor runs as an independent `tokio` task with its own mailbox,
//! processing messages one at a time. Actors communicate exclusively through message passing —
//! there is no shared mutable state. The framework provides lifecycle hooks, supervision, an
//! observer pattern, and support for periodic tasks.
//!
//! # Quick Start
//!
//! An example `Counter` actor that handles arithmetic messages might be the following:
//!
//! ```rust
//! use acktor::{Actor, Context, Handler, Message, Signal};
//!
//! #[derive(Debug)]
//! struct Counter(i64);
//!
//! impl Actor for Counter {
//! type Context = Context<Self>;
//! type Error = String;
//! }
//!
//! #[derive(Debug, Message)]
//! #[result_type(i64)]
//! enum CounterMsg {
//! Increment,
//! Get,
//! }
//!
//! impl Handler<CounterMsg> for Counter {
//! type Result = i64;
//!
//! async fn handle(&mut self, msg: CounterMsg, _ctx: &mut Self::Context) -> i64 {
//! match msg {
//! CounterMsg::Increment => self.0 += 1,
//! CounterMsg::Get => {}
//! }
//! self.0
//! }
//! }
//!
//! async fn run() {
//! let (addr, handle) = Counter(0).run("counter").unwrap();
//!
//! // fire-and-forget
//! addr.do_send(CounterMsg::Increment).await.unwrap();
//!
//! // request-reply
//! let result = addr.send(CounterMsg::Get).await.unwrap().await.unwrap();
//! println!("Counter: {result}"); // Counter: 1
//!
//! addr.do_send(Signal::Stop).await.unwrap();
//! handle.await.unwrap();
//! }
//! ```
//!
//! # Feature Flags
//!
//! | Feature | Default | Description |
//! |---------|---------|-------------|
//! | `derive` | Yes | Enables `#[derive(Message)]` and `#[derive(MessageResponse)]` macros. |
//! | `tokio-tracing` | No | Names spawned actor tasks for [`tokio-console`](https://docs.rs/console-subscriber). Requires building with `RUSTFLAGS="--cfg tokio_unstable"`. |
//! | `bottleneck-warning` | No | Emits `tracing::debug!` logs when an observer's mailbox is full during notification, useful for spotting slow consumers. |
//!
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use Signal;
pub use ;