idb_sys/request/
store_request.rs

1use js_sys::Object;
2use wasm_bindgen::{prelude::Closure, JsCast, JsValue};
3use web_sys::{DomException, Event, EventTarget, IdbRequest};
4
5use crate::{Error, Request, RequestReadyState, Transaction};
6
7/// Request returned when performing operations on an [`ObjectStore`](crate::ObjectStore).
8#[derive(Debug)]
9pub struct StoreRequest {
10    inner: IdbRequest,
11    success_callback: Option<Closure<dyn FnMut(Event)>>,
12    error_callback: Option<Closure<dyn FnMut(Event)>>,
13}
14
15impl Request for StoreRequest {
16    fn result(&self) -> Result<JsValue, Error> {
17        self.inner.result().map_err(Error::RequestResultNotFound)
18    }
19
20    fn error(&self) -> Result<Option<DomException>, Error> {
21        self.inner.error().map_err(Error::RequestErrorNotFound)
22    }
23
24    fn source(&self) -> Result<Object, Error> {
25        self.inner.source().ok_or(Error::RequestSourceNotFound)
26    }
27
28    fn transaction(&self) -> Option<Transaction> {
29        self.inner.transaction().map(Into::into)
30    }
31
32    fn ready_state(&self) -> Result<RequestReadyState, Error> {
33        self.inner.ready_state().try_into()
34    }
35
36    fn on_success<F>(&mut self, callback: F)
37    where
38        F: FnOnce(Event) + 'static,
39    {
40        let closure = Closure::once(callback);
41        self.inner
42            .set_onsuccess(Some(closure.as_ref().unchecked_ref()));
43        self.success_callback = Some(closure);
44    }
45
46    fn on_error<F>(&mut self, callback: F)
47    where
48        F: FnOnce(Event) + 'static,
49    {
50        let closure = Closure::once(callback);
51        self.inner
52            .set_onerror(Some(closure.as_ref().unchecked_ref()));
53        self.error_callback = Some(closure);
54    }
55}
56
57impl TryFrom<EventTarget> for StoreRequest {
58    type Error = Error;
59
60    fn try_from(target: EventTarget) -> Result<Self, Self::Error> {
61        let target: JsValue = target.into();
62        target
63            .dyn_into::<IdbRequest>()
64            .map(Into::into)
65            .map_err(|value| Error::UnexpectedJsType("IdbRequest", value))
66    }
67}
68
69impl From<IdbRequest> for StoreRequest {
70    fn from(inner: IdbRequest) -> Self {
71        Self {
72            inner,
73            success_callback: None,
74            error_callback: None,
75        }
76    }
77}
78
79impl From<StoreRequest> for IdbRequest {
80    fn from(request: StoreRequest) -> Self {
81        request.inner
82    }
83}
84
85impl TryFrom<JsValue> for StoreRequest {
86    type Error = Error;
87
88    fn try_from(value: JsValue) -> Result<Self, Self::Error> {
89        value
90            .dyn_into::<IdbRequest>()
91            .map(Into::into)
92            .map_err(|value| Error::UnexpectedJsType("IdbRequest", value))
93    }
94}
95
96impl From<StoreRequest> for JsValue {
97    fn from(value: StoreRequest) -> Self {
98        value.inner.into()
99    }
100}