use thiserror::Error;
#[derive(Debug, Error)]
pub enum EngineError {
#[error("model load: {0}")]
ModelLoad(String),
#[error("inference: {0}")]
Inference(String),
#[error("timeout")]
Timeout,
#[error("out of memory")]
Oom,
#[error("bad request: {0}")]
BadRequest(String),
}
impl EngineError {
pub fn status(&self) -> u16 {
match self {
EngineError::ModelLoad(_) | EngineError::Inference(_) => 500,
EngineError::Timeout => 504,
EngineError::Oom => 503,
EngineError::BadRequest(_) => 400,
}
}
pub fn kind(&self) -> &'static str {
match self {
EngineError::ModelLoad(_) => "model_load",
EngineError::Inference(_) => "inference",
EngineError::Timeout => "timeout",
EngineError::Oom => "oom",
EngineError::BadRequest(_) => "bad_request",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn error_maps_to_http_status() {
assert_eq!(EngineError::Timeout.status(), 504);
assert_eq!(EngineError::Oom.status(), 503);
assert_eq!(EngineError::BadRequest("x".into()).status(), 400);
assert_eq!(EngineError::ModelLoad("x".into()).status(), 500);
assert_eq!(EngineError::Inference("x".into()).status(), 500);
}
#[test]
fn error_kind_label_stable() {
assert_eq!(EngineError::Timeout.kind(), "timeout");
assert_eq!(EngineError::Oom.kind(), "oom");
assert_eq!(EngineError::BadRequest("".into()).kind(), "bad_request");
assert_eq!(EngineError::ModelLoad("".into()).kind(), "model_load");
assert_eq!(EngineError::Inference("".into()).kind(), "inference");
}
#[test]
fn error_display_contains_message() {
let e = EngineError::BadRequest("input trop long".into());
assert!(e.to_string().contains("input trop long"));
let t = EngineError::Timeout;
assert!(t.to_string().contains("timeout"));
}
}