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