#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("moq: {0}")]
Moq(#[from] moq_net::Error),
#[error("mux: {0}")]
Mux(#[from] moq_mux::Error),
#[error("invalid playlist URL")]
InvalidPlaylistUrl,
#[error("invalid file path")]
InvalidFilePath,
#[error("invalid file URL")]
InvalidFileUrl,
#[error("failed to parse HLS playlist: {0}")]
ParsePlaylist(String),
#[error("no usable variants found in master playlist")]
NoVariants,
#[error("playlist missing EXT-X-MAP")]
MissingMap,
#[error("encountered segment with empty URI")]
EmptySegmentUri,
#[error("implicit byte range for {url} has no preceding range for the same resource")]
MissingByteRangeOffset {
url: url::Url,
},
#[error("invalid byte range {start}+{length} for {url}")]
InvalidByteRange {
url: url::Url,
start: u64,
length: u64,
},
#[error("byte range for {url} returned {actual} bytes, expected {expected}")]
ByteRangeLengthMismatch {
url: url::Url,
expected: u64,
actual: usize,
},
#[error("byte range for {url} returned a mismatched Content-Range, expected bytes {start}-{end}")]
ByteRangeResponseMismatch {
url: url::Url,
start: u64,
end: u64,
},
#[error("HLS {kind} sequence {value} is too large to encode")]
SequenceOverflow {
kind: &'static str,
value: u64,
},
#[error(transparent)]
UrlParse(#[from] url::ParseError),
#[error(transparent)]
Reqwest(#[from] reqwest::Error),
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(transparent)]
Other(#[from] anyhow::Error),
}
pub type Result<T> = std::result::Result<T, Error>;