agent_tk/
error.rs

1/// Error enum for agent_tk
2#[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
64/// Extension trait for mapping spawn error from runtime
65pub trait SpawnErrorResultExt
66{
67  /// Result value
68  type T;
69  /// Map spawn error
70  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
82/// Extension trait for mapping elapsed error from runtime
83pub trait ElapsedErrorResultExt
84{
85  /// Result value
86  type T;
87  /// Map elapsed error
88  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}