behavior/lib.rs
1//! Pure, typed actor-behavior primitives.
2//!
3//! [`Protocol`] is stable public destination identity (`Addr` plus `Msg`). A
4//! [`Behavior`] separately owns state and folds its complete [`Behavior::Event`]
5//! algebra into exactly [`Actions`]: sends, fresh creations, and its next
6//! behavior or termination. A protocol is not a behavior, and `Behavior` is not
7//! a `Protocol` supertrait. Higher capabilities extend internal event and
8//! effect algebras while transparent wrappers preserve [`Behavior::Protocol`].
9
10// The `#[behavior]` expansion emits `::behavior::…` paths; this alias lets the
11// expansion resolve inside this crate too.
12extern crate self as behavior;
13
14mod actor;
15mod effect;
16mod effects;
17mod next;
18mod reducer;
19mod transition;
20mod user_event;
21
22pub use actor::{
23 Address, BirthMode, Births, ChildChoice, ChildCons, ChildProduct, ChildRecipient, Children,
24 ChildrenError, Create, CreationKind, Delivery, DeliveryTarget, DispatchBirth, InstallBirth,
25 MailAddr, NoBirths, NoChildren, Recipient,
26};
27pub use effect::Effect;
28pub use effects::{
29 Acted, Actions, Become, InterpretDelivery, InterpretRequest, InterpretSends,
30 InterpreterRequest, InterpreterRequests, NoReturnToEmitter, NoSends, Own, ReturnsToEmitter,
31 SendEffects, SendInput, SendInterpreter, SendLayer, SendsFor,
32};
33pub use next::{Never, Step, Stopped};
34pub use reducer::{ActionReducer, Effects, FoldFailure, Folded, fold_events};
35pub use transition::{
36 ActiveTurn, Behavior, BehaviorActed, BehaviorAddr, BehaviorBase, BehaviorMessage,
37 InitializationTurn, MessageProtocol, Protocol, delegate_transition, initialize,
38};
39pub use user_event::{
40 ComposedEvent, EventLayer, Here, Ingress, InjectEvent, Inside, User, UserEvent,
41};
42
43/// Generate the nominal protocol, closed effect products, and exact `Behavior`
44/// wiring for an inherent impl. `addr` and `message` are required. Omitting
45/// `sends`, `births`, or `error` selects the capability-free `NoSends`,
46/// `NoBirths`, or `Never` type respectively.
47///
48/// A `sends = { lane: Product }` declaration generates `ActorSends`, one
49/// distinct `ActorSendsLane` selector per field, and structural `SendEffects`,
50/// `SendsFor`, and `InterpretSends` implementations. A
51/// `births = { lane: Child }` declaration generates `ActorChildren` as the
52/// exact recursive `ChildChoice` produced by `Children` calls in declaration
53/// order. The lane labels document each child role; creation remains an
54/// authored `Children` value and is never performed by the macro.
55///
56/// Invalid receivers are rejected at compile time.
57///
58/// ```compile_fail
59/// use behavior::{Actions, BehaviorActed, MailAddr};
60///
61/// struct Invalid;
62/// #[behavior::behavior(
63/// addr = MailAddr,
64/// message = u8,
65/// )]
66/// impl Invalid {
67/// fn init(&self) -> BehaviorActed<Self> {
68/// Ok(Actions::cont())
69/// }
70/// fn receive(&mut self, _: MailAddr, _: u8) -> BehaviorActed<Self> {
71/// Ok(Actions::cont())
72/// }
73/// }
74/// ```
75///
76/// Missing receive methods are rejected by the macro itself:
77///
78/// ```compile_fail
79/// use behavior::MailAddr;
80/// struct Missing;
81/// #[behavior::behavior(
82/// addr = MailAddr,
83/// message = u8,
84/// )]
85/// impl Missing {
86/// }
87/// ```
88///
89/// Async behavior methods cannot introduce an erased or alternate execution
90/// path:
91///
92/// ```compile_fail
93/// use behavior::{Actions, BehaviorActed, MailAddr};
94/// struct Async;
95/// #[behavior::behavior(
96/// addr = MailAddr,
97/// message = u8,
98/// )]
99/// impl Async {
100/// async fn init(&mut self) -> BehaviorActed<Self> {
101/// Ok(Actions::cont())
102/// }
103/// fn receive(&mut self, _: MailAddr, _: u8) -> BehaviorActed<Self> {
104/// Ok(Actions::cont())
105/// }
106/// }
107/// ```
108///
109/// Undeclared send lanes have no selector and cannot be emitted:
110///
111/// ```compile_fail
112/// use behavior::{Actions, BehaviorActed, MailAddr, SendEffects};
113/// struct Sender;
114/// #[behavior::behavior(addr = MailAddr, message = (), sends = { replies: Vec<u8> })]
115/// impl Sender {
116/// fn receive(&mut self, _: MailAddr, _: ()) -> BehaviorActed<Self> {
117/// let mut sends = SenderSends::empty();
118/// sends.send::<_, SenderSendsUndeclared>(1);
119/// Ok(Actions::send(sends))
120/// }
121/// }
122/// ```
123///
124/// A child absent from the declared closed birth product cannot be created:
125///
126/// ```compile_fail
127/// use behavior::{Actions, BehaviorActed, Create, MailAddr};
128/// struct Declared;
129/// struct Other;
130/// struct Root;
131/// #[behavior::behavior(addr = MailAddr, message = (), births = { declared: Declared })]
132/// impl Root {
133/// fn receive(&mut self, _: MailAddr, _: ()) -> BehaviorActed<Self> {
134/// Ok(Actions::create(vec![Create::birth(1, Other)]))
135/// }
136/// }
137/// ```
138///
139/// Every generated send lane remains a separate interpreter obligation:
140///
141/// ```compile_fail
142/// use behavior::{BehaviorActed, Delivery, InterpretDelivery, InterpretSends, MailAddr,
143/// MessageProtocol, Recipient, SendInterpreter};
144/// struct Root;
145/// type First = MessageProtocol<MailAddr, u8>;
146/// type Second = MessageProtocol<MailAddr, u16>;
147/// #[behavior::behavior(addr = MailAddr, message = (), sends = {
148/// first: Vec<Delivery<First>>,
149/// second: Vec<Delivery<Second>>,
150/// })]
151/// impl Root {
152/// fn receive(&mut self, _: MailAddr, _: ()) -> BehaviorActed<Self> {
153/// Ok(behavior::Actions::cont())
154/// }
155/// }
156/// struct Incomplete;
157/// impl SendInterpreter for Incomplete { type Error = (); }
158/// impl InterpretDelivery<First> for Incomplete {
159/// fn interpret_delivery(&mut self, _: Delivery<First>) -> impl core::future::Future<Output = Result<(), ()>> + Send {
160/// async { Ok(()) }
161/// }
162/// }
163/// fn require_complete()
164/// where
165/// RootSends: InterpretSends<Incomplete, behavior::User<MailAddr, ()>, behavior::Here>,
166/// {}
167/// ```
168///
169/// Generated child products likewise require an installer for every declared
170/// alternative:
171///
172/// ```compile_fail
173/// use behavior::{BehaviorActed, Create, DispatchBirth, InstallBirth, MailAddr, Never};
174/// struct First;
175/// struct Second;
176/// #[behavior::behavior(addr = MailAddr, message = Never)]
177/// impl First {
178/// fn receive(&mut self, _: MailAddr, message: Never) -> BehaviorActed<Self> { match message {} }
179/// }
180/// #[behavior::behavior(addr = MailAddr, message = Never)]
181/// impl Second {
182/// fn receive(&mut self, _: MailAddr, message: Never) -> BehaviorActed<Self> { match message {} }
183/// }
184/// struct Root;
185/// #[behavior::behavior(addr = MailAddr, message = (), births = {
186/// first: First,
187/// second: Second,
188/// })]
189/// impl Root {
190/// fn receive(&mut self, _: MailAddr, _: ()) -> BehaviorActed<Self> {
191/// Ok(behavior::Actions::cont())
192/// }
193/// }
194/// struct Incomplete;
195/// impl InstallBirth<MailAddr, First, (), Never> for Incomplete {
196/// async fn install_birth(&mut self, _: Create<MailAddr, First>) -> Result<(), Never> { Ok(()) }
197/// }
198/// fn require_complete<T: DispatchBirth<MailAddr, Incomplete, (), Never>>() {}
199/// require_complete::<RootChildren>();
200/// ```
201pub use behavior_macros::behavior;