| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- //go:build js && wasm
- // +build js,wasm
- package idb
- import (
- "syscall/js"
- "github.com/hack-pad/safejs"
- )
- func tryAsDOMException(err error) error {
- switch err := err.(type) {
- case js.Error:
- return domExceptionAsError(safejs.Safe(err.Value))
- default:
- return err
- }
- }
- func domExceptionAsError(jsDOMException safejs.Value) error {
- truthy, err := jsDOMException.Truthy()
- if err != nil || !truthy {
- return err
- }
- domException, err := parseJSDOMException(jsDOMException)
- if err != nil {
- return err
- }
- return domException
- }
- // DOMException is a JavaScript DOMException with a standard name.
- // Use errors.Is() to compare by name.
- type DOMException struct {
- name string
- message string
- }
- // NewDOMException returns a new DOMException with the given name.
- // Only useful for errors.Is() comparisons with errors returned from idb.
- func NewDOMException(name string) DOMException {
- return DOMException{name: name}
- }
- func parseJSDOMException(jsDOMException safejs.Value) (DOMException, error) {
- name, err := jsDOMException.Get("name")
- if err != nil {
- return DOMException{}, err
- }
- nameStr, err := name.String()
- if err != nil {
- return DOMException{}, err
- }
- message, err := jsDOMException.Get("message")
- if err != nil {
- return DOMException{}, err
- }
- messageStr, err := message.String()
- if err != nil {
- return DOMException{}, err
- }
- return DOMException{
- name: nameStr,
- message: messageStr,
- }, nil
- }
- func (e DOMException) Error() string {
- if e.message == "" {
- return e.name
- }
- return e.name + ": " + e.message
- }
- // Is returns true target is a DOMException and matches this DOMException's name. Use 'errors.Is()' to call it.
- func (e DOMException) Is(target error) bool {
- targetDOMException, ok := target.(DOMException)
- return ok && targetDOMException.name == e.name
- }
|