use thiserror::Error;
use crate::sql::types::DatabaseBackend;
#[derive(Debug, Clone, Error)]
#[non_exhaustive]
pub enum QueryError {
#[error("unsupported table constraint")]
UnsupportedConstraint,
#[error("invalid column type for {backend:?}: {message}")]
InvalidColumnType {
backend: DatabaseBackend,
message: String,
},
#[error("schema error: {0}")]
SchemaError(String),
#[error("backend error ({backend:?}): {message}")]
BackendError {
backend: DatabaseBackend,
message: String,
},
#[error("unsupported action: {0}")]
UnsupportedAction(String),
#[deprecated(
since = "0.2.0",
note = "Match a specific variant (InvalidColumnType, SchemaError, BackendError, UnsupportedAction)"
)]
#[error("{0}")]
Other(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn invalid_column_type_message_includes_backend() {
let err = QueryError::InvalidColumnType {
backend: DatabaseBackend::Postgres,
message: "unknown type: ZZZ".into(),
};
let msg = err.to_string();
assert!(msg.contains("Postgres"));
assert!(msg.contains("ZZZ"));
}
#[test]
fn schema_error_displays_message() {
let err = QueryError::SchemaError("missing table foo".into());
assert_eq!(err.to_string(), "schema error: missing table foo");
}
#[test]
fn errors_can_be_cloned() {
let original = QueryError::UnsupportedConstraint;
let _clone = original.clone();
}
#[test]
#[expect(
deprecated,
reason = "0.2.0 G.3 explicit backward-compat test for deprecated QueryError::Other variant"
)]
fn other_variant_still_constructable_for_backward_compat() {
let err = QueryError::Other("legacy".into());
assert_eq!(err.to_string(), "legacy");
}
}