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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//! Unix signal handling via [`broadcast_signals`] and [`broadcast_signals_custom`].
//!
//! Actors subscribe to [`Signal`] via `ctx.subscribe::<Signal>()`.
use Borrow;
/// Re-exports [`async_signal::Signal`] as [`AsyncSignal`].
pub use Signal as AsyncSignal;
use Signals;
use crate::;
/// Wraps an [`AsyncSignal`] for broadcasting via [`Broker<Signal>`](`crate::Broker`).
;
/// Service actor that listens for `SIGINT` and `SIGTERM` and broadcasts them as [`Signal`].
///
/// Use [`broadcast_signals`] to start this service. Actors can then subscribe to [`Signal`]
/// via `ctx.subscribe::<Signal>()`.
;
/// Broadcasts `SIGINT` and `SIGTERM` to all subscribers of [`Signal`].
///
/// Call this once at startup. For a custom set of signals, use [`broadcast_signals_custom`].
///
/// # Example
///
/// ```no_run
/// use hannibal::prelude::*;
/// use hannibal::{Signal, broadcast_signals};
///
/// #[derive(Default)]
/// struct MyActor {
/// count: u8,
/// }
///
/// impl Actor for MyActor {
/// async fn started(&mut self, ctx: &mut Context<Self>) -> DynResult<()> {
/// ctx.subscribe::<Signal>().await?;
/// Ok(())
/// }
/// }
///
/// impl Handler<Signal> for MyActor {
/// async fn handle(&mut self, ctx: &mut Context<Self>, _msg: Signal) {
/// self.count += 1;
/// if self.count == 3 {
/// let _ = ctx.stop();
/// }
/// }
/// }
///
/// # #[hannibal::main(flavor = "current_thread")]
/// # async fn main() -> DynResult<()> {
/// broadcast_signals().await?;
/// MyActor::default().spawn().await?;
/// # Ok(())
/// # }
/// ```
pub async
/// Broadcasts a custom set of signals to all subscribers of [`Signal`].
///
/// For the common case of `SIGINT` and `SIGTERM`, use [`broadcast_signals`] instead.
///
/// # Example
///
/// ```no_run
/// use hannibal::prelude::*;
/// use hannibal::{Signal, broadcast_signals_custom};
/// use async_signal::Signal as OsSignal;
///
/// #[derive(Default)]
/// struct MyActor;
///
/// impl Actor for MyActor {
/// async fn started(&mut self, ctx: &mut Context<Self>) -> DynResult<()> {
/// ctx.subscribe::<Signal>().await?;
/// Ok(())
/// }
/// }
///
/// impl Handler<Signal> for MyActor {
/// async fn handle(&mut self, ctx: &mut Context<Self>, msg: Signal) {
/// match msg.0 {
/// OsSignal::Usr1 => println!("SIGUSR1 received"),
/// OsSignal::Usr2 => println!("SIGUSR2 received"),
/// _ => {}
/// }
/// }
/// }
///
/// # #[hannibal::main(flavor = "current_thread")]
/// # async fn main() -> DynResult<()> {
/// broadcast_signals_custom([OsSignal::Usr1, OsSignal::Usr2]).await?;
/// MyActor::default().spawn().await?;
/// # Ok(())
/// # }
/// ```
pub async