use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum SqlErrorKind {
Query,
Migration,
Constraint,
Connection,
InvalidRequest,
Internal,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SqlErrorPayload {
pub kind: SqlErrorKind,
pub code: String,
pub message: String,
}
impl SqlErrorPayload {
pub fn new(kind: SqlErrorKind, code: impl Into<String>, message: impl Into<String>) -> Self {
Self {
kind,
code: code.into(),
message: message.into(),
}
}
pub fn query(message: impl Into<String>) -> Self {
Self::new(SqlErrorKind::Query, "query", message)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn error_payload_uses_camel_case_kind() {
let payload = SqlErrorPayload::new(
SqlErrorKind::InvalidRequest,
"invalidPayload",
"Invalid SQL payload.",
);
let json = serde_json::to_value(payload).unwrap();
assert_eq!(
json,
serde_json::json!({
"kind": "invalidRequest",
"code": "invalidPayload",
"message": "Invalid SQL payload."
})
);
}
}