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