1use std::sync::Arc;
2
3use crate::ffi;
4
5pub type Status = i32;
10
11#[derive(Debug, thiserror::Error, Clone)]
16#[non_exhaustive]
17pub enum Error {
18 #[error("moq error: {0}")]
20 Moq(#[from] moq_net::Error),
21
22 #[error("native error: {0}")]
24 Native(#[from] moq_native::Error),
25
26 #[error("url error: {0}")]
28 Url(#[from] url::ParseError),
29
30 #[error("utf8 error: {0}")]
32 Utf8(#[from] std::str::Utf8Error),
33
34 #[error("connect error: {0}")]
36 Connect(Arc<anyhow::Error>),
37
38 #[error("invalid pointer")]
40 InvalidPointer,
41
42 #[error("invalid id")]
44 InvalidId,
45
46 #[error("not found")]
48 NotFound,
49
50 #[error("session not found")]
52 SessionNotFound,
53
54 #[error("origin not found")]
56 OriginNotFound,
57
58 #[error("announcement not found")]
60 AnnouncementNotFound,
61
62 #[error("broadcast not found")]
64 BroadcastNotFound,
65
66 #[error("catalog not found")]
68 CatalogNotFound,
69
70 #[error("media not found")]
72 MediaNotFound,
73
74 #[error("track not found")]
76 TrackNotFound,
77
78 #[error("group not found")]
80 GroupNotFound,
81
82 #[error("frame not found")]
84 FrameNotFound,
85
86 #[error("unknown format: {0}")]
88 UnknownFormat(String),
89
90 #[error("init failed: {0}")]
92 InitFailed(Arc<anyhow::Error>),
93
94 #[error("decode failed: {0}")]
96 DecodeFailed(Arc<anyhow::Error>),
97
98 #[error("timestamp overflow")]
100 TimestampOverflow(#[from] moq_net::TimeOverflow),
101
102 #[error("level error: {0}")]
104 Level(Arc<tracing::metadata::ParseLevelError>),
105
106 #[error("invalid code")]
108 InvalidCode,
109
110 #[error("panic")]
112 Panic,
113
114 #[error("offline")]
116 Offline,
117
118 #[error("unauthorized")]
120 Unauthorized,
121
122 #[error("forbidden")]
124 Forbidden,
125
126 #[error("hang error: {0}")]
128 Hang(#[from] hang::Error),
129
130 #[error("mux error: {0}")]
132 Mux(Arc<moq_mux::Error>),
133
134 #[error("no index")]
136 NoIndex,
137
138 #[error("nul error")]
140 NulError(#[from] std::ffi::NulError),
141
142 #[error("audio error: {0}")]
144 Audio(Arc<moq_audio::AudioError>),
145
146 #[error("json error: {0}")]
148 Json(Arc<serde_json::Error>),
149
150 #[error("json track error: {0}")]
152 JsonTrack(Arc<moq_json::Error>),
153}
154
155impl From<moq_json::Error> for Error {
156 fn from(err: moq_json::Error) -> Self {
157 match err {
158 moq_json::Error::Net(e) => Error::Moq(e),
159 e => Error::JsonTrack(Arc::new(e)),
160 }
161 }
162}
163
164impl From<serde_json::Error> for Error {
165 fn from(err: serde_json::Error) -> Self {
166 Error::Json(Arc::new(err))
167 }
168}
169
170impl From<moq_audio::AudioError> for Error {
171 fn from(err: moq_audio::AudioError) -> Self {
172 Error::Audio(Arc::new(err))
173 }
174}
175
176impl From<tracing::metadata::ParseLevelError> for Error {
177 fn from(err: tracing::metadata::ParseLevelError) -> Self {
178 Error::Level(Arc::new(err))
179 }
180}
181
182impl From<moq_mux::Error> for Error {
183 fn from(err: moq_mux::Error) -> Self {
184 match err {
185 moq_mux::Error::Moq(e) => Error::Moq(e),
186 moq_mux::Error::Hang(e) => Error::Hang(e),
187 e => Error::Mux(Arc::new(e)),
188 }
189 }
190}
191
192impl ffi::ReturnCode for Error {
193 fn error(&self) -> Option<&Error> {
194 Some(self)
195 }
196
197 fn code(&self) -> i32 {
198 match self {
199 Error::Moq(_) => -2,
200 Error::Url(_) => -3,
201 Error::Utf8(_) => -4,
202 Error::Connect(_) => -5,
203 Error::InvalidPointer => -6,
204 Error::InvalidId => -7,
205 Error::NotFound => -8,
206 Error::UnknownFormat(_) => -9,
207 Error::InitFailed(_) => -10,
208 Error::DecodeFailed(_) => -11,
209 Error::TimestampOverflow(_) => -13,
210 Error::Level(_) => -14,
211 Error::InvalidCode => -15,
212 Error::Panic => -16,
213 Error::Offline => -17,
214 Error::Hang(_) => -18,
215 Error::NoIndex => -19,
216 Error::NulError(_) => -20,
217 Error::SessionNotFound => -21,
218 Error::OriginNotFound => -22,
219 Error::AnnouncementNotFound => -23,
220 Error::BroadcastNotFound => -24,
221 Error::CatalogNotFound => -25,
222 Error::MediaNotFound => -26,
223 Error::TrackNotFound => -27,
224 Error::FrameNotFound => -28,
225 Error::Mux(_) => -29,
226 Error::Audio(_) => -30,
227 Error::GroupNotFound => -31,
228 Error::Native(_) => -32,
229 Error::Unauthorized => -33,
230 Error::Forbidden => -34,
231 Error::Json(_) => -35,
232 Error::JsonTrack(_) => -36,
233 }
234 }
235}