use crate::utils::err_from_event;
use web_sys::{
wasm_bindgen::{JsCast, JsValue},
DomException,
};
pub type Result<T, E> = std::result::Result<T, Error<E>>;
#[derive(Clone, Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error<E> {
#[error("Not running in a browser window")]
NotInBrowser,
#[error("IndexedDB is disabled")]
IndexedDbDisabled,
#[error("Operation is not supported by the browser")]
OperationNotSupported,
#[error("Operation is not allowed by the user agent")]
OperationNotAllowed,
#[error("Provided key is not valid")]
InvalidKey,
#[error("Version must not be zero")]
VersionMustNotBeZero,
#[error("Requested version is older than existing version")]
VersionTooOld,
#[error("The requested function cannot be called from this context")]
InvalidCall,
#[error("The provided arguments are invalid")]
InvalidArgument,
#[error("Cannot create something that already exists")]
AlreadyExists,
#[error("Cannot change something that does not exists")]
DoesNotExist,
#[error("Database is closed")]
DatabaseIsClosed,
#[error("Object store was removed")]
ObjectStoreWasRemoved,
#[error("Transaction is read-only")]
ReadOnly,
#[error("Unable to clone")]
FailedClone,
#[error("Invalid range")]
InvalidRange,
#[error("Cursor finished its range")]
CursorCompleted,
#[error(transparent)]
User(#[from] E),
}
impl<Err> Error<Err> {
pub(crate) fn from_dom_exception(err: DomException) -> Error<Err> {
match &err.name() as &str {
"NotSupportedError" => crate::Error::OperationNotSupported,
"NotAllowedError" => crate::Error::OperationNotAllowed,
"VersionError" => crate::Error::VersionTooOld,
_ => panic!("Unexpected error: {err:?}"),
}
}
pub(crate) fn from_js_value(v: JsValue) -> Error<Err> {
let err = v
.dyn_into::<web_sys::DomException>()
.expect("Trying to parse indexed_db::Error from value that is not a DomException");
Error::from_dom_exception(err)
}
pub(crate) fn from_js_event(evt: web_sys::Event) -> Error<Err> {
Error::from_dom_exception(err_from_event(evt))
}
}
pub(crate) fn name(v: &JsValue) -> Option<String> {
v.dyn_ref::<web_sys::DomException>().map(|v| v.name())
}