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("closed")]
20 Closed,
21
22 #[error("moq error: {0}")]
24 Moq(#[from] moq_lite::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("frame not found")]
80 FrameNotFound,
81
82 #[error("unknown format: {0}")]
84 UnknownFormat(String),
85
86 #[error("init failed: {0}")]
88 InitFailed(Arc<anyhow::Error>),
89
90 #[error("decode failed: {0}")]
92 DecodeFailed(Arc<anyhow::Error>),
93
94 #[error("timestamp overflow")]
96 TimestampOverflow(#[from] moq_lite::TimeOverflow),
97
98 #[error("level error: {0}")]
100 Level(Arc<tracing::metadata::ParseLevelError>),
101
102 #[error("invalid code")]
104 InvalidCode,
105
106 #[error("panic")]
108 Panic,
109
110 #[error("offline")]
112 Offline,
113
114 #[error("hang error: {0}")]
116 Hang(#[from] hang::Error),
117
118 #[error("no index")]
120 NoIndex,
121
122 #[error("nul error")]
124 NulError(#[from] std::ffi::NulError),
125}
126
127impl From<tracing::metadata::ParseLevelError> for Error {
128 fn from(err: tracing::metadata::ParseLevelError) -> Self {
129 Error::Level(Arc::new(err))
130 }
131}
132
133impl ffi::ReturnCode for Error {
134 fn code(&self) -> i32 {
135 tracing::error!("{}", self);
136 match self {
137 Error::Closed => -1,
138 Error::Moq(_) => -2,
139 Error::Url(_) => -3,
140 Error::Utf8(_) => -4,
141 Error::Connect(_) => -5,
142 Error::InvalidPointer => -6,
143 Error::InvalidId => -7,
144 Error::NotFound => -8,
145 Error::UnknownFormat(_) => -9,
146 Error::InitFailed(_) => -10,
147 Error::DecodeFailed(_) => -11,
148 Error::TimestampOverflow(_) => -13,
149 Error::Level(_) => -14,
150 Error::InvalidCode => -15,
151 Error::Panic => -16,
152 Error::Offline => -17,
153 Error::Hang(_) => -18,
154 Error::NoIndex => -19,
155 Error::NulError(_) => -20,
156 Error::SessionNotFound => -21,
157 Error::OriginNotFound => -22,
158 Error::AnnouncementNotFound => -23,
159 Error::BroadcastNotFound => -24,
160 Error::CatalogNotFound => -25,
161 Error::MediaNotFound => -26,
162 Error::TrackNotFound => -27,
163 Error::FrameNotFound => -28,
164 }
165 }
166}