1use thiserror::Error;
4
5use crate::types::ActorId;
6
7pub type ActorResult<T> = Result<T, ActorError>;
9
10#[derive(Debug, Error, Clone)]
12pub enum ActorError {
13 #[error("actor logic error: {0}")]
15 User(String),
16 #[error("actor cancelled")]
18 Cancelled,
19 #[error("actor panicked: {0}")]
21 Panic(String),
22 #[error(transparent)]
24 Spawn(#[from] SpawnError),
25}
26
27impl ActorError {
28 pub fn user(message: impl Into<String>) -> Self {
30 Self::User(message.into())
31 }
32}
33
34impl From<TimerError> for ActorError {
35 fn from(value: TimerError) -> Self {
36 ActorError::User(value.to_string())
37 }
38}
39
40#[derive(Debug, Error, Clone)]
42pub enum SendError {
43 #[error("mailbox closed")]
45 Closed,
46}
47
48#[derive(Debug, Error, Clone)]
50pub enum TrySendError {
51 #[error("mailbox full")]
53 Full,
54 #[error("mailbox closed")]
56 Closed,
57}
58
59#[derive(Debug, Error, Clone)]
61pub enum AskError {
62 #[error(transparent)]
64 Send(#[from] SendError),
65 #[error("response channel dropped")]
67 ResponseDropped,
68 #[error("actor returned error: {0}")]
70 Actor(ActorError),
71}
72
73#[derive(Debug, Error, Clone)]
75pub enum SpawnError {
76 #[error("tokio runtime handle not in scope")]
78 MissingRuntime,
79 #[error("child actor `{0}` already registered")]
81 DuplicateChild(ActorId),
82 #[error("actor name `{name}` already taken in system `{system}`")]
84 NameTaken {
85 name: String,
87 system: String,
89 },
90 #[error("actor system `{0}` already exists")]
92 SystemNameTaken(String),
93}
94
95#[derive(Debug, Error, Clone)]
97pub enum TimerError {
98 #[error("timer id not found")]
100 NotFound,
101}
102
103#[derive(Debug, Error, Clone)]
105pub enum StreamError {
106 #[error("stream id not found")]
108 NotFound,
109}
110
111impl From<StreamError> for ActorError {
112 fn from(value: StreamError) -> Self {
113 ActorError::User(value.to_string())
114 }
115}
116
117#[derive(Debug, Error, Clone)]
119pub enum SupervisionError {
120 #[error("child `{0}` not found")]
122 ChildNotFound(ActorId),
123 #[error("restart budget exhausted")]
125 BudgetExhausted,
126 #[error("factory failed: {0}")]
128 FactoryFailed(String),
129 #[error("actor is not configured as a supervisor")]
131 NotASupervisor,
132}
133
134impl From<SupervisionError> for ActorError {
135 fn from(value: SupervisionError) -> Self {
136 ActorError::User(value.to_string())
137 }
138}