#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(missing_docs)]
pub enum Error {
InvalidEnum,
InvalidValue,
InvalidOperation,
Unavailable,
StackOverflow,
StackUnderflow,
OutOfMemory,
InvalidFramebufferOperation,
ShaderError(String),
}
impl Error {
#[inline]
pub fn last_error() -> Option<Self> {
let error = unsafe { crate::c::glGetError() };
if error == crate::c::GL_NO_ERROR {
None
} else {
Some(unsafe { Self::from_gl_status_unchecked(error) })
}
}
pub fn from_gl_status(code: crate::c::GLuint) -> Option<Self> {
match code {
crate::c::GL_INVALID_ENUM => Some(Self::InvalidEnum),
crate::c::GL_INVALID_VALUE => Some(Self::InvalidValue),
crate::c::GL_INVALID_OPERATION => Some(Self::InvalidOperation),
crate::c::GL_STACK_OVERFLOW => Some(Self::StackOverflow),
crate::c::GL_STACK_UNDERFLOW => Some(Self::StackUnderflow),
crate::c::GL_OUT_OF_MEMORY => Some(Self::OutOfMemory),
crate::c::GL_INVALID_FRAMEBUFFER_OPERATION => Some(Self::InvalidFramebufferOperation),
_ => None,
}
}
pub unsafe fn from_gl_status_unchecked(code: crate::c::GLuint) -> Self {
match code {
crate::c::GL_INVALID_ENUM => Self::InvalidEnum,
crate::c::GL_INVALID_VALUE => Self::InvalidValue,
crate::c::GL_INVALID_OPERATION => Self::InvalidOperation,
crate::c::GL_STACK_OVERFLOW => Self::StackOverflow,
crate::c::GL_STACK_UNDERFLOW => Self::StackUnderflow,
crate::c::GL_OUT_OF_MEMORY => Self::OutOfMemory,
crate::c::GL_INVALID_FRAMEBUFFER_OPERATION => Self::InvalidFramebufferOperation,
_ => unreachable!(),
}
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::InvalidEnum => "Invalid Enum",
Self::InvalidValue => "Invalid Value",
Self::InvalidOperation => "Invalid Operation",
Self::Unavailable => "Function or method unavailable",
Self::StackOverflow => "Stack Overflow",
Self::StackUnderflow => "Stack Underflow",
Self::OutOfMemory => "Out of Memory",
Self::InvalidFramebufferOperation => "Invalid Framebuffer Operation",
Self::ShaderError(message) => message,
}
.fmt(f)
}
}
impl std::error::Error for Error {}
pub type Result<T> = std::result::Result<T, Error>;
pub fn check<F: Fn() -> T, T>(f: F) -> Result<T> {
let result = f();
let error = unsafe { crate::c::glGetError() };
if error == crate::c::GL_NO_ERROR {
Ok(result)
} else {
Err(unsafe { Error::from_gl_status_unchecked(error) })
}
}