use std::fmt;
#[derive(Debug)]
#[non_exhaustive]
pub enum WafRiftError {
InvalidRequest(String),
EncodingFailed(String),
GrammarError(String),
Internal(String),
}
impl fmt::Display for WafRiftError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidRequest(msg) => write!(f, "invalid request: {msg}"),
Self::EncodingFailed(msg) => write!(f, "encoding failed: {msg}"),
Self::GrammarError(msg) => write!(f, "grammar error: {msg}"),
Self::Internal(msg) => write!(f, "internal error: {msg}"),
}
}
}
impl std::error::Error for WafRiftError {}
impl WafRiftError {
pub fn invalid_request(msg: impl Into<String>) -> Self {
Self::InvalidRequest(msg.into())
}
pub fn encoding_failed(msg: impl Into<String>) -> Self {
Self::EncodingFailed(msg.into())
}
pub fn grammar_error(msg: impl Into<String>) -> Self {
Self::GrammarError(msg.into())
}
pub fn internal(msg: impl Into<String>) -> Self {
Self::Internal(msg.into())
}
}
pub type Result<T> = std::result::Result<T, WafRiftError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn error_display_invalid_request() {
let err = WafRiftError::invalid_request("missing url");
assert_eq!(err.to_string(), "invalid request: missing url");
}
#[test]
fn error_display_encoding_failed() {
let err = WafRiftError::encoding_failed("unsupported charset");
assert_eq!(err.to_string(), "encoding failed: unsupported charset");
}
#[test]
fn error_display_grammar() {
let err = WafRiftError::grammar_error("unrecognized payload type");
assert_eq!(err.to_string(), "grammar error: unrecognized payload type");
}
#[test]
fn error_display_internal() {
let err = WafRiftError::internal("state corruption");
assert_eq!(err.to_string(), "internal error: state corruption");
}
#[test]
fn error_implements_std_error() {
let err: Box<dyn std::error::Error> = Box::new(WafRiftError::invalid_request("test"));
assert!(err.to_string().contains("invalid request"));
}
}