use std::sync::Arc;
use sqlx_core::error::{DatabaseError, Error, ErrorKind};
use spg_embedded::EngineError;
#[derive(Debug)]
pub(crate) struct SpgDatabaseError {
inner: EngineError,
}
impl SpgDatabaseError {
pub(crate) fn new(inner: EngineError) -> Self {
Self { inner }
}
}
impl std::fmt::Display for SpgDatabaseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(&self.inner, f)
}
}
impl std::error::Error for SpgDatabaseError {}
impl DatabaseError for SpgDatabaseError {
fn message(&self) -> &str {
match self.inner {
EngineError::Parse(_) => "parse error",
EngineError::Storage(_) => "storage error",
EngineError::Eval(_) => "eval error",
EngineError::Unsupported(_) => "unsupported",
EngineError::TransactionAlreadyOpen => "transaction already open",
EngineError::NoActiveTransaction => "no active transaction",
EngineError::WriteRequired => "write lock required",
EngineError::RowLimitExceeded(_) => "row limit exceeded",
EngineError::Cancelled => "cancelled",
_ => "engine error",
}
}
fn as_error(&self) -> &(dyn std::error::Error + Send + Sync + 'static) {
self
}
fn as_error_mut(&mut self) -> &mut (dyn std::error::Error + Send + Sync + 'static) {
self
}
fn into_error(self: Box<Self>) -> Box<dyn std::error::Error + Send + Sync + 'static> {
self
}
fn kind(&self) -> ErrorKind {
ErrorKind::Other
}
}
pub(crate) fn engine_to_sqlx(e: EngineError) -> Error {
let boxed: Box<dyn DatabaseError> = Box::new(SpgDatabaseError::new(e));
Error::Database(boxed)
}
#[allow(dead_code)]
type _ArcMarker = Arc<()>;