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
151impl From<serde_json::Error> for Error {
152 fn from(err: serde_json::Error) -> Self {
153 Error::Json(Arc::new(err))
154 }
155}
156
157impl From<moq_audio::AudioError> for Error {
158 fn from(err: moq_audio::AudioError) -> Self {
159 Error::Audio(Arc::new(err))
160 }
161}
162
163impl From<tracing::metadata::ParseLevelError> for Error {
164 fn from(err: tracing::metadata::ParseLevelError) -> Self {
165 Error::Level(Arc::new(err))
166 }
167}
168
169impl From<moq_mux::Error> for Error {
170 fn from(err: moq_mux::Error) -> Self {
171 match err {
172 moq_mux::Error::Moq(e) => Error::Moq(e),
173 moq_mux::Error::Hang(e) => Error::Hang(e),
174 e => Error::Mux(Arc::new(e)),
175 }
176 }
177}
178
179impl ffi::ReturnCode for Error {
180 fn error(&self) -> Option<&Error> {
181 Some(self)
182 }
183
184 fn code(&self) -> i32 {
185 match self {
186 Error::Moq(_) => -2,
187 Error::Url(_) => -3,
188 Error::Utf8(_) => -4,
189 Error::Connect(_) => -5,
190 Error::InvalidPointer => -6,
191 Error::InvalidId => -7,
192 Error::NotFound => -8,
193 Error::UnknownFormat(_) => -9,
194 Error::InitFailed(_) => -10,
195 Error::DecodeFailed(_) => -11,
196 Error::TimestampOverflow(_) => -13,
197 Error::Level(_) => -14,
198 Error::InvalidCode => -15,
199 Error::Panic => -16,
200 Error::Offline => -17,
201 Error::Hang(_) => -18,
202 Error::NoIndex => -19,
203 Error::NulError(_) => -20,
204 Error::SessionNotFound => -21,
205 Error::OriginNotFound => -22,
206 Error::AnnouncementNotFound => -23,
207 Error::BroadcastNotFound => -24,
208 Error::CatalogNotFound => -25,
209 Error::MediaNotFound => -26,
210 Error::TrackNotFound => -27,
211 Error::FrameNotFound => -28,
212 Error::Mux(_) => -29,
213 Error::Audio(_) => -30,
214 Error::GroupNotFound => -31,
215 Error::Native(_) => -32,
216 Error::Unauthorized => -33,
217 Error::Forbidden => -34,
218 Error::Json(_) => -35,
219 }
220 }
221}