behavior/lib.rs
1//! Pure, typed actor-behavior primitives. A [`Behavior`] folds its associated
2//! event protocol into exactly [`Actions`]: sends, fresh creations, and its
3//! next behavior or termination. Higher capabilities are composed from these
4//! explicit transition parts.
5
6// The `workers!` macro emits `::behavior::…` paths; this alias lets
7// those expansions resolve inside this crate too (macro hygiene).
8extern crate self as behavior;
9
10mod actor;
11mod calculus;
12mod effects;
13mod next;
14mod pool;
15mod stash;
16mod supervision;
17mod timing;
18mod watch;
19
20// `Machine` is a thin state-machine helper built from the core stashing primitive.
21mod compose;
22mod machine;
23mod mailbox;
24mod protocol;
25mod shutdown;
26
27pub use actor::{
28 Address, BirthMode, Births, Create, CreationKind, Delivery, MailAddr, NoBirths, Recipient,
29 Route,
30};
31pub use calculus::{
32 ActionReducer, Behavior, BehaviorActed, BehaviorFn, Effects, EventInput, FoldFn, Folded,
33 Handler, Pure, User, UserEvent, delegate_transition, fold_events,
34};
35pub use compose::Compose;
36pub use effects::{
37 Acted, Actions, Become, Inner, Own, SendAlgebra, SendInput, SendProduct, ServiceSends,
38};
39pub use machine::{Machine, Move};
40pub use mailbox::{Transcript, run};
41pub use next::{Never, Step};
42pub use pool::{
43 AffinitySelector, AssignmentId, InterruptionPolicy, JobId, KeyedPoolEvent, KeyedPoolMessage,
44 KeyedWorkerPool, PoolActions, PoolAssignment, PoolBehaviorSends, PoolConfigError, PoolError,
45 PoolEvent, PoolInterruption, PoolMessage, PoolRejection, PoolResponse, PoolSends, WorkerPhase,
46 WorkerPool, WorkerRetirement,
47};
48pub use protocol::{
49 ChildEvent, ChildStopped, CreationEvent, CreationRejection, CreationResolved, ObserveChild,
50 ObserveCreation, ObservePeer, PeerEvent, PeerStopped, ReplacementResolution,
51 ReportWorkerCreationResolved, ReportWorkerStopped, ScheduleAfter, ScheduleAt, ShutdownEvent,
52 ShutdownRequested, TimeEvent, TimerElapsed, TimerGeneration, TimerId, UnwatchPeer,
53 WorkerCreationEvent, WorkerCreationResolved, WorkerEvent, WorkerStopped,
54};
55pub use shutdown::{FinalizeOnShutdown, ShutdownProtocol, ShutdownReaction, StopOnShutdown};
56pub use stash::{Stash, StashRoute};
57pub use supervision::{
58 IncarnationPhase, Proxy, ProxyActions, ProxyCommand, ProxyEvent, ProxySends, RestartPolicy,
59 Strategy, SupervisionEvent, SupervisionFailure, SupervisionFailureReaction, Supervisor,
60 SupervisorActions, SupervisorSends, restart_all, restart_one, restart_rest,
61 retire_on_supervision_failure, stop_on_supervision_failure,
62};
63pub use timing::{
64 Deadline, DeadlineActions, DeadlineEvent, DeadlineReaction, DeadlineSends, ReceiveTimeout,
65 ReceiveTimeoutActions, ReceiveTimeoutError, ReceiveTimeoutEvent, ReceiveTimeoutReaction,
66 ReceiveTimeoutSends, TimedEvent,
67};
68pub use watch::{LinkReaction, Watch, WatchEvent, WatchSends, stop_on_abnormal_death};
69
70mod exit;
71
72pub use exit::{Crash, Exit, RestartDenial, SupervisionFailureReason};
73
74/// Generate `Behavior` wiring for an inherent impl with exact `&mut self`
75/// methods. Invalid receivers are rejected at compile time.
76///
77/// ```compile_fail
78/// use behavior::{Actions, Delivery, MailAddr, Never, NoBirths};
79///
80/// struct Invalid;
81/// #[behavior::behavior(
82/// addr = MailAddr,
83/// message = u8,
84/// sends = Vec<Delivery<MailAddr, Never>>,
85/// births = NoBirths,
86/// error = Never,
87/// )]
88/// impl Invalid {
89/// fn init(&self) -> behavior::Acted<MailAddr, Never, Vec<Delivery<MailAddr, Never>>, NoBirths, Never> {
90/// Ok(Actions::cont())
91/// }
92/// fn receive(&mut self, _: MailAddr, _: u8) -> behavior::Acted<MailAddr, Never, Vec<Delivery<MailAddr, Never>>, NoBirths, Never> {
93/// Ok(Actions::cont())
94/// }
95/// }
96/// ```
97///
98/// Missing transition methods are rejected by the macro itself:
99///
100/// ```compile_fail
101/// use behavior::{Actions, Delivery, MailAddr, Never, NoBirths};
102/// struct Missing;
103/// #[behavior::behavior(
104/// addr = MailAddr,
105/// message = u8,
106/// sends = Vec<Delivery<MailAddr, Never>>,
107/// births = NoBirths,
108/// error = Never,
109/// )]
110/// impl Missing {
111/// fn init(&mut self) -> behavior::Acted<MailAddr, Never, Vec<Delivery<MailAddr, Never>>, NoBirths, Never> {
112/// Ok(Actions::cont())
113/// }
114/// }
115/// ```
116///
117/// Async behavior methods cannot introduce an erased or alternate execution
118/// path:
119///
120/// ```compile_fail
121/// use behavior::{Actions, Delivery, MailAddr, Never, NoBirths};
122/// struct Async;
123/// #[behavior::behavior(
124/// addr = MailAddr,
125/// message = u8,
126/// sends = Vec<Delivery<MailAddr, Never>>,
127/// births = NoBirths,
128/// error = Never,
129/// )]
130/// impl Async {
131/// async fn init(&mut self) -> behavior::Acted<MailAddr, Never, Vec<Delivery<MailAddr, Never>>, NoBirths, Never> {
132/// Ok(Actions::cont())
133/// }
134/// fn receive(&mut self, _: MailAddr, _: u8) -> behavior::Acted<MailAddr, Never, Vec<Delivery<MailAddr, Never>>, NoBirths, Never> {
135/// Ok(Actions::cont())
136/// }
137/// }
138/// ```
139pub use behavior_macros::behavior;
140pub use behavior_macros::workers;