1#[derive(thiserror::Error, Debug)]
3#[allow(missing_docs)]
4pub enum Error
5{
6 #[error("UTF8 Error: '{0}'")]
7 Utf8Error(#[from] std::str::Utf8Error),
8 #[error("MQTT Connection Error: '{0}'")]
9 #[cfg(feature = "mqtt")]
10 MQTTConnectionError(#[from] mqtt_channel::Error),
11 #[error("MQTT Service Error: '{0}'")]
12 #[cfg(feature = "mqtt")]
13 MQTTServiceError(#[from] mqtt_service::Error),
14 #[error("Capability '{0}' is unknown.")]
15 UnknownCapability(&'static str),
16 #[error("Capability '{0}' already defined.")]
17 DuplicateCapability(&'static str),
18 #[error("An error occured during transport: '{0}'.")]
19 TransportError(String),
20 #[error("Invalid task type: {0}.")]
21 InvalidTaskType(String),
22 #[error("Unknown task type: {0}.")]
23 UnknownTaskType(String),
24 #[error("State '{0}' is unknown.")]
25 UnknownState(&'static str),
26 #[error("State '{0}' already defined.")]
27 DuplicateState(&'static str),
28 #[error("The execution failed: {0}.")]
29 ExecutionFailed(#[from] Box<Error>),
30 #[error("The task '{0}' cannot be executed.")]
31 CannotExecute(String),
32 #[error("No executor.")]
33 NoExecutor(),
34 #[error("Invalid collection: {0}.")]
35 InvalidCollection(String),
36 #[error("Unknown value in collection {0} with key {1}.")]
37 UnknownValue(String, String),
38 #[error("Serialization error: {0}")]
39 JsonSerializationError(#[from] serde_json::Error),
40 #[error("Serialization error: {0}")]
41 CborSerializationError(#[from] ciborium::ser::Error<std::io::Error>),
42 #[error("Deserialization error: {0}")]
43 DeserializationError(String),
44 #[error("Mutex error: {0}")]
45 MutexError(String),
46 #[error("Runtime error: {0}")]
47 Runtime(String),
48 #[error("Invalid UUID: {0} with error {1}")]
49 InvalidUuid(String, String),
50 #[error("Goals cannot be executed.")]
51 CannotExecuteGoals,
52 #[error("Futures spawn error {0}")]
53 FutureSpawnError(<crate::Runtime as yaaral::TaskInterface>::SpawnError),
54 #[error("Future timed out {0:?}")]
55 TimeoutElapsed(<crate::Runtime as yaaral::time::TimeInterface>::Elapsed),
56 #[error("Unimplemented: {0}.")]
57 Unimplemented(&'static str),
58 #[error("InternalError: {0}.")]
59 InternalError(&'static str),
60 #[error("AsyncSendError: {0}.")]
61 AsyncSendError(String),
62}
63
64pub trait SpawnErrorResultExt
66{
67 type T;
69 fn map_spawn_error(self) -> Result<Self::T, Error>;
71}
72
73impl<T> SpawnErrorResultExt for Result<T, <crate::Runtime as yaaral::TaskInterface>::SpawnError>
74{
75 type T = T;
76 fn map_spawn_error(self) -> Result<Self::T, Error>
77 {
78 self.map_err(Error::FutureSpawnError)
79 }
80}
81
82pub trait ElapsedErrorResultExt
84{
85 type T;
87 fn map_elapsed_error(self) -> Result<Self::T, Error>;
89}
90
91impl<T> ElapsedErrorResultExt
92 for Result<T, <crate::Runtime as yaaral::time::TimeInterface>::Elapsed>
93{
94 type T = T;
95 fn map_elapsed_error(self) -> Result<Self::T, Error>
96 {
97 self.map_err(Error::TimeoutElapsed)
98 }
99}
100
101impl<'a, T> From<std::sync::PoisonError<std::sync::MutexGuard<'a, T>>> for Error
102{
103 fn from(value: std::sync::PoisonError<std::sync::MutexGuard<'a, T>>) -> Self
104 {
105 Error::MutexError(value.to_string())
106 }
107}
108
109impl<'a, T> From<std::sync::PoisonError<std::sync::RwLockWriteGuard<'a, T>>> for Error
110{
111 fn from(value: std::sync::PoisonError<std::sync::RwLockWriteGuard<'a, T>>) -> Self
112 {
113 Error::MutexError(value.to_string())
114 }
115}
116
117impl From<yaaral::Infallible> for Error
118{
119 fn from(_: yaaral::Infallible) -> Self
120 {
121 Error::Unimplemented("yaaral::Infallible should never trigger.")
122 }
123}
124
125impl<T> From<async_broadcast::SendError<T>> for Error
126{
127 fn from(value: async_broadcast::SendError<T>) -> Self
128 {
129 Error::AsyncSendError(value.to_string())
130 }
131}