use super::ErrorDomain;
use std::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ErrorKind {
Unsupported,
InvalidArgument,
Metal,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Error {
kind: ErrorKind,
domain: Option<ErrorDomain>,
code: Option<isize>,
message: String,
}
impl Error {
pub(crate) fn invalid_argument(message: impl Into<String>) -> Self {
Self {
kind: ErrorKind::InvalidArgument,
domain: None,
code: None,
message: message.into(),
}
}
pub(crate) fn from_ffi(error: metal_rust_ffi::Error) -> Self {
Self {
kind: if error.invalid_argument {
ErrorKind::InvalidArgument
} else if error.code.is_some() {
ErrorKind::Metal
} else {
ErrorKind::Unsupported
},
domain: error.domain.map(ErrorDomain::new),
code: error.code,
message: error.message,
}
}
#[must_use]
pub const fn kind(&self) -> ErrorKind {
self.kind
}
#[must_use]
pub const fn code(&self) -> Option<isize> {
self.code
}
#[must_use]
pub fn domain(&self) -> Option<&ErrorDomain> {
self.domain.as_ref()
}
#[must_use]
pub fn message(&self) -> &str {
&self.message
}
}
impl fmt::Display for Error {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(&self.message)
}
}
impl std::error::Error for Error {}