1use wasm_bindgen::{JsCast, JsValue};
2use web_sys::IdbKeyRange;
3
4use crate::Error;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct KeyRange {
9 inner: IdbKeyRange,
10}
11
12impl KeyRange {
13 pub fn only(value: &JsValue) -> Result<Self, Error> {
15 let inner = IdbKeyRange::only(value).map_err(Error::KeyRangeCreateFailed)?;
16
17 Ok(Self { inner })
18 }
19
20 pub fn bound(
23 lower: &JsValue,
24 upper: &JsValue,
25 lower_open: Option<bool>,
26 upper_open: Option<bool>,
27 ) -> Result<Self, Error> {
28 let inner = IdbKeyRange::bound_with_lower_open_and_upper_open(
29 lower,
30 upper,
31 lower_open.unwrap_or_default(),
32 upper_open.unwrap_or_default(),
33 )
34 .map_err(Error::KeyRangeCreateFailed)?;
35
36 Ok(Self { inner })
37 }
38
39 pub fn lower_bound(lower: &JsValue, lower_open: Option<bool>) -> Result<Self, Error> {
42 let inner = IdbKeyRange::lower_bound_with_open(lower, lower_open.unwrap_or_default())
43 .map_err(Error::KeyRangeCreateFailed)?;
44
45 Ok(Self { inner })
46 }
47
48 pub fn upper_bound(upper: &JsValue, upper_open: Option<bool>) -> Result<Self, Error> {
51 let inner = IdbKeyRange::upper_bound_with_open(upper, upper_open.unwrap_or_default())
52 .map_err(Error::KeyRangeCreateFailed)?;
53
54 Ok(Self { inner })
55 }
56
57 pub fn lower(&self) -> Result<JsValue, Error> {
59 self.inner.lower().map_err(Error::KeyRangeBoundNotFound)
60 }
61
62 pub fn upper(&self) -> Result<JsValue, Error> {
64 self.inner.upper().map_err(Error::KeyRangeBoundNotFound)
65 }
66
67 pub fn lower_open(&self) -> bool {
69 self.inner.lower_open()
70 }
71
72 pub fn upper_open(&self) -> bool {
74 self.inner.upper_open()
75 }
76
77 pub fn includes(&self, value: &JsValue) -> Result<bool, Error> {
79 self.inner
80 .includes(value)
81 .map_err(Error::KeyRangeIncludesFailed)
82 }
83}
84
85impl From<IdbKeyRange> for KeyRange {
86 fn from(inner: IdbKeyRange) -> Self {
87 Self { inner }
88 }
89}
90
91impl From<KeyRange> for IdbKeyRange {
92 fn from(key_range: KeyRange) -> Self {
93 key_range.inner
94 }
95}
96
97impl TryFrom<JsValue> for KeyRange {
98 type Error = Error;
99
100 fn try_from(value: JsValue) -> Result<Self, Self::Error> {
101 value
102 .dyn_into::<IdbKeyRange>()
103 .map(Into::into)
104 .map_err(|value| Error::UnexpectedJsType("IdbKeyRange", value))
105 }
106}
107
108impl From<KeyRange> for JsValue {
109 fn from(value: KeyRange) -> Self {
110 value.inner.into()
111 }
112}