key_range.go raw
1 //go:build js && wasm
2 // +build js,wasm
3
4 package idb
5
6 import (
7 "github.com/hack-pad/safejs"
8 )
9
10 func GetJsIDBKeyRange() (safejs.Value, error) {
11 return safejs.Global().Get("IDBKeyRange")
12 }
13
14 // KeyRange represents a continuous interval over some data type that is used for keys. Records can be retrieved from ObjectStore and Index objects using keys or a range of keys.
15 type KeyRange struct {
16 jsKeyRange safejs.Value
17 }
18
19 // WrapKeyRange wraps a safejs.Value into a KeyRange.
20 func WrapKeyRange(jsKeyRange safejs.Value) *KeyRange {
21 return &KeyRange{jsKeyRange}
22 }
23
24 // NewKeyRangeBound creates a new key range with the specified upper and lower bounds.
25 // The bounds can be open (that is, the bounds exclude the endpoint values) or closed (that is, the bounds include the endpoint values).
26 func NewKeyRangeBound(lower, upper safejs.Value, lowerOpen, upperOpen bool) (*KeyRange, error) {
27 jsIDBKeyRange, err := GetJsIDBKeyRange()
28 if err != nil {
29 return nil, err
30 }
31 keyRange, err := jsIDBKeyRange.Call("bound", lower, upper, lowerOpen, upperOpen)
32 if err != nil {
33 return nil, tryAsDOMException(err)
34 }
35 return WrapKeyRange(keyRange), nil
36 }
37
38 // NewKeyRangeLowerBound creates a new key range with only a lower bound.
39 func NewKeyRangeLowerBound(lower safejs.Value, open bool) (*KeyRange, error) {
40 jsIDBKeyRange, err := GetJsIDBKeyRange()
41 if err != nil {
42 return nil, err
43 }
44 keyRange, err := jsIDBKeyRange.Call("lowerBound", lower, open)
45 if err != nil {
46 return nil, tryAsDOMException(err)
47 }
48 return WrapKeyRange(keyRange), nil
49 }
50
51 // NewKeyRangeUpperBound creates a new key range with only an upper bound.
52 func NewKeyRangeUpperBound(upper safejs.Value, open bool) (*KeyRange, error) {
53 jsIDBKeyRange, err := GetJsIDBKeyRange()
54 if err != nil {
55 return nil, err
56 }
57 keyRange, err := jsIDBKeyRange.Call("upperBound", upper, open)
58 if err != nil {
59 return nil, tryAsDOMException(err)
60 }
61 return WrapKeyRange(keyRange), nil
62 }
63
64 // NewKeyRangeOnly creates a new key range containing a single value.
65 func NewKeyRangeOnly(only safejs.Value) (*KeyRange, error) {
66 jsIDBKeyRange, err := GetJsIDBKeyRange()
67 if err != nil {
68 return nil, err
69 }
70 keyRange, err := jsIDBKeyRange.Call("only", only)
71 if err != nil {
72 return nil, tryAsDOMException(err)
73 }
74 return WrapKeyRange(keyRange), nil
75 }
76
77 // Lower returns the lower bound of the key range.
78 func (k *KeyRange) Lower() (safejs.Value, error) {
79 lower, err := k.jsKeyRange.Get("lower")
80 return lower, err
81 }
82
83 // Upper returns the upper bound of the key range.
84 func (k *KeyRange) Upper() (safejs.Value, error) {
85 upper, err := k.jsKeyRange.Get("upper")
86 return upper, err
87 }
88
89 // LowerOpen returns false if the lower-bound value is included in the key range.
90 func (k *KeyRange) LowerOpen() (bool, error) {
91 lowerOpen, err := k.jsKeyRange.Get("lowerOpen")
92 if err != nil {
93 return false, err
94 }
95 return lowerOpen.Bool()
96 }
97
98 // UpperOpen returns false if the upper-bound value is included in the key range.
99 func (k *KeyRange) UpperOpen() (bool, error) {
100 upperOpen, err := k.jsKeyRange.Get("upperOpen")
101 if err != nil {
102 return false, err
103 }
104 return upperOpen.Bool()
105 }
106
107 // Includes returns a boolean indicating whether a specified key is inside the key range.
108 func (k *KeyRange) Includes(key safejs.Value) (bool, error) {
109 includes, err := k.jsKeyRange.Call("includes", key)
110 if err != nil {
111 return false, tryAsDOMException(err)
112 }
113 return includes.Bool()
114 }
115
116 // Unwrap unwraps the key range into a safejs.Value.
117 func (k *KeyRange) Unwrap() safejs.Value {
118 return k.jsKeyRange
119 }
120