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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
use crate::JaegerError;
use ::orchestra::OrchestraError as OverseerError;
#[derive(thiserror::Error, Debug, Clone)]
pub enum RuntimeApiError {
#[error("The runtime API '{runtime_api_name}' cannot be executed: {source}")]
Execution {
runtime_api_name: &'static str,
#[source]
source: std::sync::Arc<dyn 'static + std::error::Error + Send + Sync>,
},
#[error("The API is not supported by the runtime at the relay-parent")]
NotSupported {
runtime_api_name: &'static str,
},
}
#[derive(Debug, Clone)]
pub struct ChainApiError {
msg: String,
}
impl From<&str> for ChainApiError {
fn from(s: &str) -> Self {
s.to_owned().into()
}
}
impl From<String> for ChainApiError {
fn from(msg: String) -> Self {
Self { msg }
}
}
impl core::fmt::Display for ChainApiError {
fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> {
write!(f, "{}", self.msg)
}
}
impl std::error::Error for ChainApiError {}
#[derive(PartialEq, Debug, Clone)]
pub enum RecoveryError {
Invalid,
Unavailable,
}
impl std::fmt::Display for RecoveryError {
fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> {
write!(f, "{}", self)
}
}
impl std::error::Error for RecoveryError {}
#[derive(thiserror::Error, Debug)]
#[allow(missing_docs)]
pub enum SubsystemError {
#[error(transparent)]
NotifyCancellation(#[from] futures::channel::oneshot::Canceled),
#[error(transparent)]
QueueError(#[from] futures::channel::mpsc::SendError),
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(transparent)]
Infallible(#[from] std::convert::Infallible),
#[error(transparent)]
Prometheus(#[from] substrate_prometheus_endpoint::PrometheusError),
#[error(transparent)]
Jaeger(#[from] JaegerError),
#[error("Failed to {0}")]
Context(String),
#[error("Subsystem stalled: {0}")]
SubsystemStalled(&'static str),
#[error(transparent)]
Generated(#[from] OverseerError),
#[error("Error originated in {origin}")]
FromOrigin {
origin: &'static str,
#[source]
source: Box<dyn 'static + std::error::Error + Send + Sync>,
},
}
impl SubsystemError {
pub fn with_origin<E: 'static + Send + Sync + std::error::Error>(
origin: &'static str,
err: E,
) -> Self {
Self::FromOrigin { origin, source: Box::new(err) }
}
}
pub type SubsystemResult<T> = Result<T, self::SubsystemError>;