import html/script
import monoucha/javascript
import monoucha/jserror
import monoucha/quickjs
import monoucha/tojs
import types/opt
const NamesTable = {
"IndexSizeError": 1u16,
"HierarchyRequestError": 3u16,
"WrongDocumentError": 4u16,
"InvalidCharacterError": 5u16,
"NoModificationAllowedError": 7u16,
"NotFoundError": 8u16,
"NotSupportedError": 9u16,
"InUseAttributeError": 10u16,
"InvalidStateError": 11u16,
"SyntaxError": 12u16,
"InvalidModificationError": 13u16,
"NamespaceError": 14u16,
"InvalidAccessError": 15u16,
"TypeMismatchError": 17u16,
"SecurityError": 18u16,
"NetworkError": 19u16,
"AbortError": 20u16,
"URLMismatchError": 21u16,
"QuotaExceededError": 22u16,
"TimeoutError": 23u16,
"InvalidNodeTypeError": 24u16,
"DataCloneError": 25u16
}
type
DOMExceptionType = enum
INDEX_SIZE_ERR = 1
DOMSTRING_SIZE_ERR = 2
HIERARCHY_REQUEST_ERR = 3
WRONG_DOCUMENT_ERR = 4
INVALID_CHARACTER_ERR = 5
NO_DATA_ALLOWED_ERR = 6
NO_MODIFICATION_ALLOWED_ERR = 7
NOT_FOUND_ERR = 8
NOT_SUPPORTED_ERR = 9
INUSE_ATTRIBUTE_ERR = 10
INVALID_STATE_ERR = 11
SYNTAX_ERR = 12
INVALID_MODIFICATION_ERR = 13
NAMESPACE_ERR = 14
INVALID_ACCESS_ERR = 15
VALIDATION_ERR = 16
TYPE_MISMATCH_ERR = 17
SECURITY_ERR = 18
NETWORK_ERR = 19
ABORT_ERR = 20
URL_MISMATCH_ERR = 21
QUOTA_EXCEEDED_ERR = 22
TIMEOUT_ERR = 23
INVALID_NODE_TYPE_ERR = 24
DATA_CLONE_ERR = 25
DOMException* = ref object of JSError
name* {.jsget.}: string
code: int
DOMResult*[T] = Result[T, DOMException]
jsDestructor(DOMException)
proc newDOMException*(message = ""; name = "Error"): DOMException {.jsctor.} =
return DOMException(e: jeCustom, name: name, message: message, code: -1)
template errDOMException*(message, name: string): untyped =
err(newDOMException(message, name))
proc JS_ThrowDOMException*(ctx: JSContext; message, name: string): JSValue =
return JS_Throw(ctx, ctx.toJS(newDOMException(message, name)))
func getMessage(this: DOMException): string {.jsfget: "message".} =
return this.message
func getCode(this: DOMException): uint16 {.jsfget: "code".} =
if this.code == -1:
this.code = 0
for it in NamesTable:
if it[0] == this.name:
this.code = int(it[1])
break
return uint16(this.code)
proc addDOMExceptionModule*(ctx: JSContext) =
let domExceptionCID = ctx.registerType(DOMException, JS_CLASS_ERROR)
ctx.defineConsts(domExceptionCID, DOMExceptionType)