Skip to main content

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};
30pub use calculus::{
31    ActionReducer, Behavior, BehaviorActed, BehaviorFn, Effects, EventInput, FoldFn, Folded,
32    Handler, Pure, User, UserEvent, delegate_transition, fold_events,
33};
34pub use compose::Compose;
35pub use effects::{
36    Acted, Actions, Become, Inner, Own, SendAlgebra, SendInput, SendProduct, ServiceSends,
37};
38pub use machine::{Machine, Move};
39pub use mailbox::{Transcript, run};
40pub use next::{Never, Step};
41pub use pool::{
42    AffinitySelector, AssignmentId, InterruptionPolicy, JobId, KeyedPoolEvent, KeyedPoolMessage,
43    KeyedWorkerPool, PoolActions, PoolAssignment, PoolBehaviorSends, PoolConfigError, PoolError,
44    PoolEvent, PoolInterruption, PoolMessage, PoolRejection, PoolResponse, PoolSends, WorkerPhase,
45    WorkerPool, WorkerRetirement,
46};
47pub use protocol::{
48    ChildEvent, ChildStopped, CreationEvent, CreationRejection, CreationResolved, ObserveChild,
49    ObserveCreation, ObservePeer, PeerEvent, PeerStopped, ReplacementResolution,
50    ReportWorkerCreationResolved, ReportWorkerStopped, ScheduleAfter, ScheduleAt, ShutdownEvent,
51    ShutdownRequested, TimeEvent, TimerElapsed, TimerGeneration, TimerId, UnwatchPeer,
52    WorkerCreationEvent, WorkerCreationResolved, WorkerEvent, WorkerStopped,
53};
54pub use shutdown::{FinalizeOnShutdown, ShutdownProtocol, ShutdownReaction, StopOnShutdown};
55pub use stash::{Stash, StashRoute};
56pub use supervision::{
57    IncarnationPhase, Proxy, ProxyActions, ProxyCommand, ProxyEvent, ProxySends, RestartPolicy,
58    Strategy, SupervisionEvent, SupervisionFailure, SupervisionFailureReaction, Supervisor,
59    SupervisorActions, SupervisorSends, restart_all, restart_one, restart_rest,
60    retire_on_supervision_failure, stop_on_supervision_failure,
61};
62pub use timing::{
63    Deadline, DeadlineActions, DeadlineEvent, DeadlineReaction, DeadlineSends, ReceiveTimeout,
64    ReceiveTimeoutActions, ReceiveTimeoutError, ReceiveTimeoutEvent, ReceiveTimeoutReaction,
65    ReceiveTimeoutSends, TimedEvent,
66};
67pub use watch::{LinkReaction, Watch, WatchEvent, WatchSends, stop_on_abnormal_death};
68
69mod exit;
70
71pub use exit::{Crash, Exit, RestartDenial, SupervisionFailureReason};
72
73/// Generate `Behavior` wiring for an inherent impl with exact `&mut self`
74/// methods. Invalid receivers are rejected at compile time.
75///
76/// ```compile_fail
77/// use behavior::{Actions, Delivery, MailAddr, Never, NoBirths};
78///
79/// struct Invalid;
80/// #[behavior::behavior(
81///     addr = MailAddr,
82///     message = u8,
83///     sends = Vec<Never>,
84///     births = NoBirths,
85///     error = Never,
86/// )]
87/// impl Invalid {
88///     fn init(&self) -> behavior::Acted<MailAddr, Never, Vec<Never>, NoBirths, Never> {
89///         Ok(Actions::cont())
90///     }
91///     fn receive(&mut self, _: MailAddr, _: u8) -> behavior::Acted<MailAddr, Never, Vec<Never>, NoBirths, Never> {
92///         Ok(Actions::cont())
93///     }
94/// }
95/// ```
96///
97/// Missing transition methods are rejected by the macro itself:
98///
99/// ```compile_fail
100/// use behavior::{Actions, Delivery, MailAddr, Never, NoBirths};
101/// struct Missing;
102/// #[behavior::behavior(
103///     addr = MailAddr,
104///     message = u8,
105///     sends = Vec<Never>,
106///     births = NoBirths,
107///     error = Never,
108/// )]
109/// impl Missing {
110///     fn init(&mut self) -> behavior::Acted<MailAddr, Never, Vec<Never>, NoBirths, Never> {
111///         Ok(Actions::cont())
112///     }
113/// }
114/// ```
115///
116/// Async behavior methods cannot introduce an erased or alternate execution
117/// path:
118///
119/// ```compile_fail
120/// use behavior::{Actions, Delivery, MailAddr, Never, NoBirths};
121/// struct Async;
122/// #[behavior::behavior(
123///     addr = MailAddr,
124///     message = u8,
125///     sends = Vec<Never>,
126///     births = NoBirths,
127///     error = Never,
128/// )]
129/// impl Async {
130///     async fn init(&mut self) -> behavior::Acted<MailAddr, Never, Vec<Never>, NoBirths, Never> {
131///         Ok(Actions::cont())
132///     }
133///     fn receive(&mut self, _: MailAddr, _: u8) -> behavior::Acted<MailAddr, Never, Vec<Never>, NoBirths, Never> {
134///         Ok(Actions::cont())
135///     }
136/// }
137/// ```
138pub use behavior_macros::behavior;
139pub use behavior_macros::workers;