idb_sys/request/
store_request.rs1use 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#[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}