use core::fmt;
use crate::ffi::OSStatus;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum VTError {
SessionCreateFailed(OSStatus),
SetPropertyFailed { key: String, status: OSStatus },
PrepareFailed(OSStatus),
EncodeFailed(OSStatus),
CompleteFailed(OSStatus),
PixelBufferCreateFailed(i32),
EncoderCallback(OSStatus),
InvalidArgument(String),
}
impl VTError {
#[must_use]
pub const fn status(&self) -> Option<OSStatus> {
match self {
Self::SessionCreateFailed(s)
| Self::SetPropertyFailed { status: s, .. }
| Self::PrepareFailed(s)
| Self::EncodeFailed(s)
| Self::CompleteFailed(s)
| Self::EncoderCallback(s) => Some(*s),
Self::PixelBufferCreateFailed(_) | Self::InvalidArgument(_) => None,
}
}
}
impl fmt::Display for VTError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::SessionCreateFailed(s) => write!(f, "VTCompressionSessionCreate failed: {s}"),
Self::SetPropertyFailed { key, status } => {
write!(f, "VTSessionSetProperty({key:?}) failed: {status}")
}
Self::PrepareFailed(s) => {
write!(f, "VTCompressionSessionPrepareToEncodeFrames failed: {s}")
}
Self::EncodeFailed(s) => write!(f, "VTCompressionSessionEncodeFrame failed: {s}"),
Self::CompleteFailed(s) => write!(f, "VTCompressionSessionCompleteFrames failed: {s}"),
Self::PixelBufferCreateFailed(s) => {
write!(f, "CVPixelBufferCreateWithIOSurface failed: {s}")
}
Self::EncoderCallback(s) => write!(f, "encoder callback reported status {s}"),
Self::InvalidArgument(m) => write!(f, "invalid argument: {m}"),
}
}
}
impl std::error::Error for VTError {}