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
#![allow(unused_variables)]
use crate::{
Message,
system::SystemMsg,
actor::{
actor_ref::{BasicActorRef, Sender},
actor_cell::Context
}
};
pub trait Actor: Send + 'static {
type Msg: Message;
fn pre_start(&mut self, ctx: &Context<Self::Msg>) {
}
fn post_start(&mut self, ctx: &Context<Self::Msg>) {
}
fn post_stop(&mut self) {
}
fn sys_recv(&mut self,
ctx: &Context<Self::Msg>,
msg: SystemMsg,
sender: Sender) {
}
fn supervisor_strategy(&self) -> Strategy {
Strategy::Restart
}
fn recv(&mut self,
ctx: &Context<Self::Msg>,
msg: Self::Msg,
sender: Sender);
}
impl<A: Actor + ?Sized> Actor for Box<A> {
type Msg = A::Msg;
fn pre_start(&mut self, ctx: &Context<Self::Msg>) {
(**self).pre_start(ctx);
}
fn post_start(&mut self, ctx: &Context<Self::Msg>) {
(**self).post_start(ctx)
}
fn post_stop(&mut self) {
(**self).post_stop()
}
fn sys_recv(&mut self,
ctx: &Context<Self::Msg>,
msg: SystemMsg,
sender: Option<BasicActorRef>) {
(**self).sys_recv(ctx, msg, sender)
}
fn supervisor_strategy(&self) -> Strategy {
(**self).supervisor_strategy()
}
fn recv(&mut self,
ctx: &Context<Self::Msg>,
msg: Self::Msg,
sender: Option<BasicActorRef>) {
(**self).recv(ctx, msg, sender)
}
}
pub trait Receive<Msg: Message> {
type Msg: Message;
fn receive(&mut self,
ctx: &Context<Self::Msg>,
msg: Msg,
sender: Option<BasicActorRef>);
}
pub type BoxActor<Msg> = Box<dyn Actor<Msg=Msg> + Send>;
pub enum Strategy {
Stop,
Restart,
Escalate,
}