use surrealdb_types::Error as TypesError;
pub fn query_timeout_error(duration: std::time::Duration) -> TypesError {
TypesError::query(
format!(
"The query was not executed because it exceeded the timeout: {}",
crate::val::Duration::from(duration)
),
surrealdb_types::QueryError::TimedOut {
duration,
},
)
}
pub fn types_error_from_anyhow(error: anyhow::Error) -> TypesError {
crate::err::anyhow_to_types_error(error)
}
#[cfg(test)]
mod tests {
use surrealdb_types::{Error as TypesError, QueryError};
use super::types_error_from_anyhow;
use crate::err;
use crate::kvs::Error as KvsError;
#[test]
fn bare_kvs_conflict_maps_to_transaction_conflict() {
let err = anyhow::Error::new(KvsError::TransactionConflict("write conflict".into()));
let te = types_error_from_anyhow(err);
assert_eq!(te.query_details(), Some(&QueryError::TransactionConflict));
}
#[test]
fn wrapped_kvs_conflict_still_maps_to_transaction_conflict() {
let err = anyhow::Error::new(err::Error::Kvs(KvsError::TransactionConflict(
"write conflict".into(),
)));
let te = types_error_from_anyhow(err);
assert_eq!(te.query_details(), Some(&QueryError::TransactionConflict));
}
#[test]
fn existing_types_error_is_returned_verbatim() {
let original = TypesError::query("boom".to_string(), QueryError::NotExecuted);
let te = types_error_from_anyhow(anyhow::Error::new(original));
assert_eq!(te.query_details(), Some(&QueryError::NotExecuted));
}
}