pub const QUERCUSCORE_OK: i32 = 0;
pub const QUERCUSCORE_E_INVALID: i32 = -10001;
pub const QUERCUSCORE_E_STATE: i32 = -10002;
pub const QUERCUSCORE_E_FAILED: i32 = -10003;
pub const QUERCUSCORE_E_NOT_FOUND: i32 = -10004;
pub const QUERCUSCORE_E_NOMEM: i32 = -10005;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Clone, Debug, thiserror::Error)]
pub enum Error {
#[error("render: invalid argument")]
Invalid,
#[error("render: invalid state")]
State,
#[error("render: operation failed: {0}")]
Failed(String),
#[error("render: not found")]
NotFound,
#[error("render: out of memory")]
NoMem,
}
impl Error {
pub fn code(&self) -> i32 {
match self {
Error::Invalid => QUERCUSCORE_E_INVALID,
Error::State => QUERCUSCORE_E_STATE,
Error::Failed(_) => QUERCUSCORE_E_FAILED,
Error::NotFound => QUERCUSCORE_E_NOT_FOUND,
Error::NoMem => QUERCUSCORE_E_NOMEM,
}
}
pub fn new(message: impl Into<String>) -> Self {
Error::Failed(message.into())
}
}
impl From<ocio_rs::OcioError> for Error {
fn from(e: ocio_rs::OcioError) -> Self {
Error::Failed(e.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_is_non_empty() {
for msg in [
Error::Invalid.to_string(),
Error::State.to_string(),
Error::Failed("context".into()).to_string(),
Error::NotFound.to_string(),
Error::NoMem.to_string(),
] {
assert!(!msg.trim().is_empty(), "empty Display message");
}
assert!(
Error::Failed("context".into())
.to_string()
.contains("context")
);
}
#[test]
fn error_is_object_safe() {
let errs: Vec<Box<dyn std::error::Error>> = vec![
Box::new(Error::Invalid),
Box::new(Error::State),
Box::new(Error::Failed("context".into())),
Box::new(Error::NotFound),
Box::new(Error::NoMem),
];
assert_eq!(errs.len(), 5);
}
#[test]
fn source_is_none() {
assert!(std::error::Error::source(&Error::Failed("context".into())).is_none());
}
#[test]
fn code_mapping_unchanged() {
assert_eq!(Error::Invalid.code(), QUERCUSCORE_E_INVALID);
assert_eq!(Error::State.code(), QUERCUSCORE_E_STATE);
assert_eq!(Error::Failed("context".into()).code(), QUERCUSCORE_E_FAILED);
assert_eq!(Error::NotFound.code(), QUERCUSCORE_E_NOT_FOUND);
assert_eq!(Error::NoMem.code(), QUERCUSCORE_E_NOMEM);
}
}