#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum WafRiftError {
#[error("invalid request: {0}")]
InvalidRequest(String),
#[error("encoding failed: {0}")]
EncodingFailed(String),
#[error("grammar error: {0}")]
GrammarError(String),
#[error("internal error: {0}")]
Internal(String),
}
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"));
}
}