// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/webxr

///|
/// XRWebGLRenderingContext typedef
pub type XRWebGLRenderingContext

///|
pub extern "js" fn XRWebGLRenderingContext::to_js_value(
  self : XRWebGLRenderingContext,
) -> JsValue =
  #| (self) => self

///|
/// Create XRWebGLRenderingContext from WebGLRenderingContext
pub extern "js" fn XRWebGLRenderingContext::from_web_gl_rendering_context(
  v : WebGLRenderingContext,
) -> XRWebGLRenderingContext =
  #| (v) => v

///|
/// Create XRWebGLRenderingContext from WebGL2RenderingContext
pub extern "js" fn XRWebGLRenderingContext::from_web_gl2_rendering_context(
  v : WebGL2RenderingContext,
) -> XRWebGLRenderingContext =
  #| (v) => v

///|
/// Check if this XRWebGLRenderingContext is WebGLRenderingContext
pub extern "js" fn XRWebGLRenderingContext::is_web_gl_rendering_context(
  self : XRWebGLRenderingContext,
) -> Bool =
  #| (self) => self instanceof WebGLRenderingContext

///|
/// Check if this XRWebGLRenderingContext is WebGL2RenderingContext
pub extern "js" fn XRWebGLRenderingContext::is_web_gl2_rendering_context(
  self : XRWebGLRenderingContext,
) -> Bool =
  #| (self) => self instanceof WebGL2RenderingContext

///|
/// Try to get XRWebGLRenderingContext as WebGLRenderingContext
pub extern "js" fn XRWebGLRenderingContext::as_web_gl_rendering_context(
  self : XRWebGLRenderingContext,
) -> WebGLRenderingContext? =
  #| (self) => (self instanceof WebGLRenderingContext) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Try to get XRWebGLRenderingContext as WebGL2RenderingContext
pub extern "js" fn XRWebGLRenderingContext::as_web_gl2_rendering_context(
  self : XRWebGLRenderingContext,
) -> WebGL2RenderingContext? =
  #| (self) => (self instanceof WebGL2RenderingContext) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Flatten Option[XRWebGLRenderingContext] to WebGLRenderingContext?
pub fn XRWebGLRenderingContext::bind_as_web_gl_rendering_context(
  value : XRWebGLRenderingContext?,
) -> WebGLRenderingContext? {
  match value {
    Some(v) => v.as_web_gl_rendering_context()
    None => None
  }
}

///|
/// Flatten Option[XRWebGLRenderingContext] to WebGL2RenderingContext?
pub fn XRWebGLRenderingContext::bind_as_web_gl2_rendering_context(
  value : XRWebGLRenderingContext?,
) -> WebGL2RenderingContext? {
  match value {
    Some(v) => v.as_web_gl2_rendering_context()
    None => None
  }
}

///|
/// XRSessionMode enum
pub(all) enum XRSessionMode {
  Inline
  ImmersiveVr
  ImmersiveAr
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XRSessionMode::to_string(self : XRSessionMode) -> String {
  match self {
    XRSessionMode::Inline => "inline"
    XRSessionMode::ImmersiveVr => "immersive-vr"
    XRSessionMode::ImmersiveAr => "immersive-ar"
  }
}

///|
/// Parse from string value
pub fn XRSessionMode::from_string(s : String) -> XRSessionMode? {
  match s {
    "inline" => Some(XRSessionMode::Inline)
    "immersive-vr" => Some(XRSessionMode::ImmersiveVr)
    "immersive-ar" => Some(XRSessionMode::ImmersiveAr)
    _ => None
  }
}

///|
/// XRVisibilityState enum
pub(all) enum XRVisibilityState {
  Visible
  VisibleBlurred
  Hidden
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XRVisibilityState::to_string(self : XRVisibilityState) -> String {
  match self {
    XRVisibilityState::Visible => "visible"
    XRVisibilityState::VisibleBlurred => "visible-blurred"
    XRVisibilityState::Hidden => "hidden"
  }
}

///|
/// Parse from string value
pub fn XRVisibilityState::from_string(s : String) -> XRVisibilityState? {
  match s {
    "visible" => Some(XRVisibilityState::Visible)
    "visible-blurred" => Some(XRVisibilityState::VisibleBlurred)
    "hidden" => Some(XRVisibilityState::Hidden)
    _ => None
  }
}

///|
/// XRReferenceSpaceType enum
pub(all) enum XRReferenceSpaceType {
  Viewer
  Local
  LocalFloor
  BoundedFloor
  Unbounded
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XRReferenceSpaceType::to_string(self : XRReferenceSpaceType) -> String {
  match self {
    XRReferenceSpaceType::Viewer => "viewer"
    XRReferenceSpaceType::Local => "local"
    XRReferenceSpaceType::LocalFloor => "local-floor"
    XRReferenceSpaceType::BoundedFloor => "bounded-floor"
    XRReferenceSpaceType::Unbounded => "unbounded"
  }
}

///|
/// Parse from string value
pub fn XRReferenceSpaceType::from_string(s : String) -> XRReferenceSpaceType? {
  match s {
    "viewer" => Some(XRReferenceSpaceType::Viewer)
    "local" => Some(XRReferenceSpaceType::Local)
    "local-floor" => Some(XRReferenceSpaceType::LocalFloor)
    "bounded-floor" => Some(XRReferenceSpaceType::BoundedFloor)
    "unbounded" => Some(XRReferenceSpaceType::Unbounded)
    _ => None
  }
}

///|
/// XREye enum
pub(all) enum XREye {
  None
  Left
  Right
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XREye::to_string(self : XREye) -> String {
  match self {
    XREye::None => "none"
    XREye::Left => "left"
    XREye::Right => "right"
  }
}

///|
/// Parse from string value
pub fn XREye::from_string(s : String) -> XREye? {
  match s {
    "none" => Some(XREye::None)
    "left" => Some(XREye::Left)
    "right" => Some(XREye::Right)
    _ => None
  }
}

///|
/// XRHandedness enum
pub(all) enum XRHandedness {
  None
  Left
  Right
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XRHandedness::to_string(self : XRHandedness) -> String {
  match self {
    XRHandedness::None => "none"
    XRHandedness::Left => "left"
    XRHandedness::Right => "right"
  }
}

///|
/// Parse from string value
pub fn XRHandedness::from_string(s : String) -> XRHandedness? {
  match s {
    "none" => Some(XRHandedness::None)
    "left" => Some(XRHandedness::Left)
    "right" => Some(XRHandedness::Right)
    _ => None
  }
}

///|
/// XRTargetRayMode enum
pub(all) enum XRTargetRayMode {
  Gaze
  TrackedPointer
  Screen
  TransientPointer
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XRTargetRayMode::to_string(self : XRTargetRayMode) -> String {
  match self {
    XRTargetRayMode::Gaze => "gaze"
    XRTargetRayMode::TrackedPointer => "tracked-pointer"
    XRTargetRayMode::Screen => "screen"
    XRTargetRayMode::TransientPointer => "transient-pointer"
  }
}

///|
/// Parse from string value
pub fn XRTargetRayMode::from_string(s : String) -> XRTargetRayMode? {
  match s {
    "gaze" => Some(XRTargetRayMode::Gaze)
    "tracked-pointer" => Some(XRTargetRayMode::TrackedPointer)
    "screen" => Some(XRTargetRayMode::Screen)
    "transient-pointer" => Some(XRTargetRayMode::TransientPointer)
    _ => None
  }
}

///|
/// XRFrameRequestCallback callback interface
pub type XRFrameRequestCallback

///|
/// Create XRFrameRequestCallback from a MoonBit function
pub extern "js" fn XRFrameRequestCallback::from_fn(
  handler : (DOMHighResTimeStamp, XRFrame) -> Unit,
) -> XRFrameRequestCallback =
  #| (handler) => (a0, a1) => handler(a0, a1)

///|
/// XRRenderStateInit dictionary
pub(all) struct XRRenderStateInit {
  depthNear : Double?
  depthFar : Double?
  passthroughFullyObscured : Bool?
  inlineVerticalFieldOfView : Double?
  baseLayer : Nullable[XRWebGLLayer]
  layers : Array[XRLayer]?
}

///|
/// Create a new XRRenderStateInit with default values
pub fn XRRenderStateInit::default() -> XRRenderStateInit {
  XRRenderStateInit::{
    depthNear: None,
    depthFar: None,
    passthroughFullyObscured: None,
    inlineVerticalFieldOfView: None,
    baseLayer: Nullable::Undefined,
    layers: None,
  }
}

///|
extern "js" fn XRRenderStateInit::to_js_ffi(
  self : XRRenderStateInit,
) -> JsValue =
  #| (self) => ({
  #|   depthNear: ((() => { const v = self.depthNear; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   depthFar: ((() => { const v = self.depthFar; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   passthroughFullyObscured: (self.passthroughFullyObscured === -1 ? undefined : self.passthroughFullyObscured),
  #|   inlineVerticalFieldOfView: ((() => { const v = self.inlineVerticalFieldOfView; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   baseLayer: ((() => { const v = self.baseLayer; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   layers: ((() => { const v = self.layers; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRRenderStateInit::to_js(self : XRRenderStateInit) -> JsValue {
  XRRenderStateInit::to_js_ffi(self)
}

///|
extern "js" fn XRRenderStateInit::from_js_ffi(
  value : JsValue,
) -> XRRenderStateInit =
  #| (v) => ({
  #|   depthNear: (v.depthNear === undefined ? { $tag: 0 } : { $tag: 1, _0: v.depthNear }),
  #|   depthFar: (v.depthFar === undefined ? { $tag: 0 } : { $tag: 1, _0: v.depthFar }),
  #|   passthroughFullyObscured: (v.passthroughFullyObscured === undefined ? -1 : v.passthroughFullyObscured),
  #|   inlineVerticalFieldOfView: (v.inlineVerticalFieldOfView === undefined ? { $tag: 0 } : { $tag: 1, _0: v.inlineVerticalFieldOfView }),
  #|   baseLayer: (v.baseLayer === undefined ? { $tag: 0 } : v.baseLayer === null ? { $tag: 1 } : { $tag: 2, _0: v.baseLayer }),
  #|   layers: (v.layers === undefined ? { $tag: 0 } : { $tag: 1, _0: v.layers })
  #| })

///|
/// Convert from JsValue
pub fn XRRenderStateInit::from_js(value : JsValue) -> XRRenderStateInit {
  XRRenderStateInit::from_js_ffi(value)
}

///|
/// XRWebGLLayerInit dictionary
pub(all) struct XRWebGLLayerInit {
  antialias : Bool?
  depth : Bool?
  stencil : Bool?
  alpha : Bool?
  ignoreDepthValues : Bool?
  framebufferScaleFactor : Double?
}

///|
/// Create a new XRWebGLLayerInit with default values
pub fn XRWebGLLayerInit::default() -> XRWebGLLayerInit {
  XRWebGLLayerInit::{
    antialias: None,
    depth: None,
    stencil: None,
    alpha: None,
    ignoreDepthValues: None,
    framebufferScaleFactor: None,
  }
}

///|
extern "js" fn XRWebGLLayerInit::to_js_ffi(self : XRWebGLLayerInit) -> JsValue =
  #| (self) => ({
  #|   antialias: (self.antialias === -1 ? undefined : self.antialias),
  #|   depth: (self.depth === -1 ? undefined : self.depth),
  #|   stencil: (self.stencil === -1 ? undefined : self.stencil),
  #|   alpha: (self.alpha === -1 ? undefined : self.alpha),
  #|   ignoreDepthValues: (self.ignoreDepthValues === -1 ? undefined : self.ignoreDepthValues),
  #|   framebufferScaleFactor: ((() => { const v = self.framebufferScaleFactor; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRWebGLLayerInit::to_js(self : XRWebGLLayerInit) -> JsValue {
  XRWebGLLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRWebGLLayerInit::from_js_ffi(
  value : JsValue,
) -> XRWebGLLayerInit =
  #| (v) => ({
  #|   antialias: (v.antialias === undefined ? -1 : v.antialias),
  #|   depth: (v.depth === undefined ? -1 : v.depth),
  #|   stencil: (v.stencil === undefined ? -1 : v.stencil),
  #|   alpha: (v.alpha === undefined ? -1 : v.alpha),
  #|   ignoreDepthValues: (v.ignoreDepthValues === undefined ? -1 : v.ignoreDepthValues),
  #|   framebufferScaleFactor: (v.framebufferScaleFactor === undefined ? { $tag: 0 } : { $tag: 1, _0: v.framebufferScaleFactor })
  #| })

///|
/// Convert from JsValue
pub fn XRWebGLLayerInit::from_js(value : JsValue) -> XRWebGLLayerInit {
  XRWebGLLayerInit::from_js_ffi(value)
}

///|
/// XRSessionEventInit dictionary
pub(all) struct XRSessionEventInit {
  session : XRSession
}

///|
/// Create a new XRSessionEventInit
pub fn XRSessionEventInit::new(session~ : XRSession) -> XRSessionEventInit {
  XRSessionEventInit::{ session, }
}

///|
extern "js" fn XRSessionEventInit::to_js_ffi(
  self : XRSessionEventInit,
) -> JsValue =
  #| (self) => ({
  #|   session: self.session
  #| })

///|
/// Convert to JsValue
pub fn XRSessionEventInit::to_js(self : XRSessionEventInit) -> JsValue {
  XRSessionEventInit::to_js_ffi(self)
}

///|
extern "js" fn XRSessionEventInit::from_js_ffi(
  value : JsValue,
) -> XRSessionEventInit =
  #| (v) => ({
  #|   session: v.session
  #| })

///|
/// Convert from JsValue
pub fn XRSessionEventInit::from_js(value : JsValue) -> XRSessionEventInit {
  XRSessionEventInit::from_js_ffi(value)
}

///|
/// XRInputSourceEventInit dictionary
pub(all) struct XRInputSourceEventInit {
  frame : XRFrame
  inputSource : XRInputSource
}

///|
/// Create a new XRInputSourceEventInit
pub fn XRInputSourceEventInit::new(
  frame~ : XRFrame,
  inputSource~ : XRInputSource,
) -> XRInputSourceEventInit {
  XRInputSourceEventInit::{ frame, inputSource }
}

///|
extern "js" fn XRInputSourceEventInit::to_js_ffi(
  self : XRInputSourceEventInit,
) -> JsValue =
  #| (self) => ({
  #|   frame: self.frame,
  #|   inputSource: self.inputSource
  #| })

///|
/// Convert to JsValue
pub fn XRInputSourceEventInit::to_js(self : XRInputSourceEventInit) -> JsValue {
  XRInputSourceEventInit::to_js_ffi(self)
}

///|
extern "js" fn XRInputSourceEventInit::from_js_ffi(
  value : JsValue,
) -> XRInputSourceEventInit =
  #| (v) => ({
  #|   frame: v.frame,
  #|   inputSource: v.inputSource
  #| })

///|
/// Convert from JsValue
pub fn XRInputSourceEventInit::from_js(
  value : JsValue,
) -> XRInputSourceEventInit {
  XRInputSourceEventInit::from_js_ffi(value)
}

///|
/// XRInputSourcesChangeEventInit dictionary
pub(all) struct XRInputSourcesChangeEventInit {
  session : XRSession
  added : Array[XRInputSource]
  removed : Array[XRInputSource]
}

///|
/// Create a new XRInputSourcesChangeEventInit
pub fn XRInputSourcesChangeEventInit::new(
  session~ : XRSession,
) -> XRInputSourcesChangeEventInit {
  XRInputSourcesChangeEventInit::{ session, added: [], removed: [] }
}

///|
extern "js" fn XRInputSourcesChangeEventInit::to_js_ffi(
  self : XRInputSourcesChangeEventInit,
) -> JsValue =
  #| (self) => ({
  #|   session: self.session,
  #|   added: self.added,
  #|   removed: self.removed
  #| })

///|
/// Convert to JsValue
pub fn XRInputSourcesChangeEventInit::to_js(
  self : XRInputSourcesChangeEventInit,
) -> JsValue {
  XRInputSourcesChangeEventInit::to_js_ffi(self)
}

///|
extern "js" fn XRInputSourcesChangeEventInit::from_js_ffi(
  value : JsValue,
) -> XRInputSourcesChangeEventInit =
  #| (v) => ({
  #|   session: v.session,
  #|   added: v.added,
  #|   removed: v.removed
  #| })

///|
/// Convert from JsValue
pub fn XRInputSourcesChangeEventInit::from_js(
  value : JsValue,
) -> XRInputSourcesChangeEventInit {
  XRInputSourcesChangeEventInit::from_js_ffi(value)
}

///|
/// XRReferenceSpaceEventInit dictionary
pub(all) struct XRReferenceSpaceEventInit {
  referenceSpace : XRReferenceSpace
  transform : Nullable[XRRigidTransform]
}

///|
/// Create a new XRReferenceSpaceEventInit
pub fn XRReferenceSpaceEventInit::new(
  referenceSpace~ : XRReferenceSpace,
) -> XRReferenceSpaceEventInit {
  XRReferenceSpaceEventInit::{ referenceSpace, transform: Nullable::Undefined }
}

///|
extern "js" fn XRReferenceSpaceEventInit::to_js_ffi(
  self : XRReferenceSpaceEventInit,
) -> JsValue =
  #| (self) => ({
  #|   referenceSpace: self.referenceSpace,
  #|   transform: ((() => { const v = self.transform; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRReferenceSpaceEventInit::to_js(
  self : XRReferenceSpaceEventInit,
) -> JsValue {
  XRReferenceSpaceEventInit::to_js_ffi(self)
}

///|
extern "js" fn XRReferenceSpaceEventInit::from_js_ffi(
  value : JsValue,
) -> XRReferenceSpaceEventInit =
  #| (v) => ({
  #|   referenceSpace: v.referenceSpace,
  #|   transform: (v.transform === undefined ? { $tag: 0 } : v.transform === null ? { $tag: 1 } : { $tag: 2, _0: v.transform })
  #| })

///|
/// Convert from JsValue
pub fn XRReferenceSpaceEventInit::from_js(
  value : JsValue,
) -> XRReferenceSpaceEventInit {
  XRReferenceSpaceEventInit::from_js_ffi(value)
}

///|
/// XRVisibilityMaskChangeEventInit dictionary
pub(all) struct XRVisibilityMaskChangeEventInit {
  session : XRSession
  eye : XREye
  index : Int
  vertices : Float32Array
  indices : Uint32Array
}

///|
/// Create a new XRVisibilityMaskChangeEventInit
pub fn XRVisibilityMaskChangeEventInit::new(
  session~ : XRSession,
  eye~ : XREye,
  vertices~ : Float32Array,
  indices~ : Uint32Array,
) -> XRVisibilityMaskChangeEventInit {
  XRVisibilityMaskChangeEventInit::{ session, eye, index: 0, vertices, indices }
}

///|
extern "js" fn XRVisibilityMaskChangeEventInit::to_js_ffi(
  self : XRVisibilityMaskChangeEventInit,
) -> JsValue =
  #| (self) => ({
  #|   session: self.session,
  #|   eye: ['none', 'left', 'right'][self.eye],
  #|   index: self.index,
  #|   vertices: self.vertices,
  #|   indices: self.indices
  #| })

///|
/// Convert to JsValue
pub fn XRVisibilityMaskChangeEventInit::to_js(
  self : XRVisibilityMaskChangeEventInit,
) -> JsValue {
  XRVisibilityMaskChangeEventInit::to_js_ffi(self)
}

///|
extern "js" fn XRVisibilityMaskChangeEventInit::from_js_ffi(
  value : JsValue,
) -> XRVisibilityMaskChangeEventInit =
  #| (v) => ({
  #|   session: v.session,
  #|   eye: ['none', 'left', 'right'].indexOf(v.eye),
  #|   index: v.index,
  #|   vertices: v.vertices,
  #|   indices: v.indices
  #| })

///|
/// Convert from JsValue
pub fn XRVisibilityMaskChangeEventInit::from_js(
  value : JsValue,
) -> XRVisibilityMaskChangeEventInit {
  XRVisibilityMaskChangeEventInit::from_js_ffi(value)
}

///|
/// XRSessionSupportedPermissionDescriptor dictionary
pub(all) struct XRSessionSupportedPermissionDescriptor {
  mode : XRSessionMode?
}

///|
/// Create a new XRSessionSupportedPermissionDescriptor with default values
pub fn XRSessionSupportedPermissionDescriptor::default() -> XRSessionSupportedPermissionDescriptor {
  XRSessionSupportedPermissionDescriptor::{ mode: None }
}

///|
extern "js" fn XRSessionSupportedPermissionDescriptor::to_js_ffi(
  self : XRSessionSupportedPermissionDescriptor,
) -> JsValue =
  #| (self) => ({
  #|   mode: ((() => { const v = self.mode; if (v === undefined) return undefined; return ['inline', 'immersive-vr', 'immersive-ar'][v]; })())
  #| })

///|
/// Convert to JsValue
pub fn XRSessionSupportedPermissionDescriptor::to_js(
  self : XRSessionSupportedPermissionDescriptor,
) -> JsValue {
  XRSessionSupportedPermissionDescriptor::to_js_ffi(self)
}

///|
extern "js" fn XRSessionSupportedPermissionDescriptor::from_js_ffi(
  value : JsValue,
) -> XRSessionSupportedPermissionDescriptor =
  #| (v) => ({
  #|   mode: (v.mode === undefined ? undefined : ['inline', 'immersive-vr', 'immersive-ar'].indexOf(v.mode))
  #| })

///|
/// Convert from JsValue
pub fn XRSessionSupportedPermissionDescriptor::from_js(
  value : JsValue,
) -> XRSessionSupportedPermissionDescriptor {
  XRSessionSupportedPermissionDescriptor::from_js_ffi(value)
}

///|
/// XRPermissionDescriptor dictionary
pub(all) struct XRPermissionDescriptor {
  mode : XRSessionMode?
  requiredFeatures : Array[String]?
  optionalFeatures : Array[String]?
}

///|
/// Create a new XRPermissionDescriptor with default values
pub fn XRPermissionDescriptor::default() -> XRPermissionDescriptor {
  XRPermissionDescriptor::{
    mode: None,
    requiredFeatures: None,
    optionalFeatures: None,
  }
}

///|
extern "js" fn XRPermissionDescriptor::to_js_ffi(
  self : XRPermissionDescriptor,
) -> JsValue =
  #| (self) => ({
  #|   mode: ((() => { const v = self.mode; if (v === undefined) return undefined; return ['inline', 'immersive-vr', 'immersive-ar'][v]; })()),
  #|   requiredFeatures: ((() => { const v = self.requiredFeatures; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   optionalFeatures: ((() => { const v = self.optionalFeatures; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRPermissionDescriptor::to_js(self : XRPermissionDescriptor) -> JsValue {
  XRPermissionDescriptor::to_js_ffi(self)
}

///|
extern "js" fn XRPermissionDescriptor::from_js_ffi(
  value : JsValue,
) -> XRPermissionDescriptor =
  #| (v) => ({
  #|   mode: (v.mode === undefined ? undefined : ['inline', 'immersive-vr', 'immersive-ar'].indexOf(v.mode)),
  #|   requiredFeatures: (v.requiredFeatures === undefined ? { $tag: 0 } : { $tag: 1, _0: v.requiredFeatures }),
  #|   optionalFeatures: (v.optionalFeatures === undefined ? { $tag: 0 } : { $tag: 1, _0: v.optionalFeatures })
  #| })

///|
/// Convert from JsValue
pub fn XRPermissionDescriptor::from_js(
  value : JsValue,
) -> XRPermissionDescriptor {
  XRPermissionDescriptor::from_js_ffi(value)
}

///|
/// XRSystem interface
pub type XRSystem

///|
pub extern "js" fn XRSystem::to_js_value(self : XRSystem) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRSystem (unchecked)
pub extern "js" fn XRSystem::from_js_value(v : JsValue) -> XRSystem =
  #| (v) => v

///|
/// Safely cast JsValue to XRSystem (checked with instanceof)
pub extern "js" fn XRSystem::from_js_value_opt(v : JsValue) -> XRSystem? =
  #| (v) => (v instanceof XRSystem) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRSystem (checked with instanceof)
pub extern "js" fn JsValue::as_xr_system(self : JsValue) -> XRSystem? =
  #| (self) => (self instanceof XRSystem) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRSystem (unchecked)
pub extern "js" fn JsValue::to_xr_system(self : JsValue) -> XRSystem =
  #| (self) => self

///|
pub extern "js" fn XRSystem::to_event_target(self : XRSystem) -> EventTarget =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum XRSystemIsSessionSupportedError {
  SecurityError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRSystemRequestSessionError {
  SecurityError(JsError)
  InvalidStateError(JsError)
  NotSupportedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn XRSystem::is_session_supported(
  self : XRSystem,
  mode : XRSessionMode,
) -> Promise[Result[Bool, XRSystemIsSessionSupportedError]] =
  #| (self, mode) => self.isSessionSupported(['inline', 'immersive-vr', 'immersive-ar'][mode]).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'SecurityError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }))

///|
pub extern "js" fn XRSystem::request_session(
  self : XRSystem,
  mode : XRSessionMode,
) -> Promise[Result[XRSession, XRSystemRequestSessionError]] =
  #| (self, mode) => self.requestSession(['inline', 'immersive-vr', 'immersive-ar'][mode]).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'SecurityError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; if (n === 'NotSupportedError') return { $tag: 2, _0: e }; return { $tag: 3, _0: e }; })() }))

///|
extern "js" fn XRSystem::request_session_with_options_ffi(
  self : XRSystem,
  mode : XRSessionMode,
  options : JsValue,
) -> Promise[Result[XRSession, XRSystemRequestSessionError]] =
  #| (self, mode, options) => self.requestSession(['inline', 'immersive-vr', 'immersive-ar'][mode], options).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'SecurityError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; if (n === 'NotSupportedError') return { $tag: 2, _0: e }; return { $tag: 3, _0: e }; })() }))

///|
pub fn XRSystem::request_session_with_options(
  self : XRSystem,
  mode : XRSessionMode,
  options : XRSessionInit,
) -> Promise[Result[XRSession, XRSystemRequestSessionError]] {
  XRSystem::request_session_with_options_ffi(self, mode, options.to_js())
}

///|
pub extern "js" fn XRSystem::set_ondevicechange(
  self : XRSystem,
  handler : (Event) -> Unit,
) -> Unit =
  #| (self, handler) => { self.ondevicechange = (e) => handler(e) }

///|
pub extern "js" fn XRSystem::clear_ondevicechange(self : XRSystem) -> Unit =
  #| (self) => { self.ondevicechange = null }

///|
/// XRSession interface
pub type XRSession

///|
pub extern "js" fn XRSession::to_js_value(self : XRSession) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRSession (unchecked)
pub extern "js" fn XRSession::from_js_value(v : JsValue) -> XRSession =
  #| (v) => v

///|
/// Safely cast JsValue to XRSession (checked with instanceof)
pub extern "js" fn XRSession::from_js_value_opt(v : JsValue) -> XRSession? =
  #| (v) => (v instanceof XRSession) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRSession (checked with instanceof)
pub extern "js" fn JsValue::as_xr_session(self : JsValue) -> XRSession? =
  #| (self) => (self instanceof XRSession) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRSession (unchecked)
pub extern "js" fn JsValue::to_xr_session(self : JsValue) -> XRSession =
  #| (self) => self

///|
pub extern "js" fn XRSession::to_event_target(self : XRSession) -> EventTarget =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum XRSessionUpdateRenderStateError {
  TypeError(JsError)
  InvalidStateError(JsError)
  NotSupportedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRSessionRequestReferenceSpaceError {
  NotSupportedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRSessionRequestHitTestSourceError {
  NotAllowedError(JsError)
  InvalidStateError(JsError)
  NotSupportedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRSessionRequestHitTestSourceForTransientInputError {
  NotAllowedError(JsError)
  InvalidStateError(JsError)
  NotSupportedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRSessionRequestLightProbeError {
  InvalidStateError(JsError)
  NotSupportedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn XRSession::get_visibility_state(
  self : XRSession,
) -> XRVisibilityState =
  #| (self) => ['visible', 'visible-blurred', 'hidden'].indexOf(self.visibilityState)

///|
pub extern "js" fn XRSession::get_frame_rate(self : XRSession) -> Double? =
  #| (self) => (() => { const v = self.frameRate; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRSession::get_supported_frame_rates(
  self : XRSession,
) -> Float32Array? =
  #| (self) => (() => { const v = self.supportedFrameRates; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRSession::get_render_state(
  self : XRSession,
) -> XRRenderState =
  #| (self) => self.renderState

///|
pub extern "js" fn XRSession::get_input_sources(
  self : XRSession,
) -> XRInputSourceArray =
  #| (self) => self.inputSources

///|
pub extern "js" fn XRSession::get_tracked_sources(
  self : XRSession,
) -> XRInputSourceArray =
  #| (self) => self.trackedSources

///|
pub extern "js" fn XRSession::get_enabled_features(
  self : XRSession,
) -> Array[String] =
  #| (self) => self.enabledFeatures

///|
pub extern "js" fn XRSession::get_is_system_keyboard_supported(
  self : XRSession,
) -> Bool =
  #| (self) => self.isSystemKeyboardSupported

///|
pub extern "js" fn XRSession::update_render_state(
  self : XRSession,
) -> Result[Unit, XRSessionUpdateRenderStateError] =
  #| (self) => (() => { try { self.updateRenderState(); return { $tag: 1, _0: undefined }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; if (n === 'NotSupportedError') return { $tag: 2, _0: e }; return { $tag: 3, _0: e }; })() }; } })()

///|
extern "js" fn XRSession::update_render_state_with_state_ffi(
  self : XRSession,
  state : JsValue,
) -> Result[Unit, XRSessionUpdateRenderStateError] =
  #| (self, state) => (() => { try { self.updateRenderState(state); return { $tag: 1, _0: undefined }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; if (n === 'NotSupportedError') return { $tag: 2, _0: e }; return { $tag: 3, _0: e }; })() }; } })()

///|
pub fn XRSession::update_render_state_with_state(
  self : XRSession,
  state : XRRenderStateInit,
) -> Result[Unit, XRSessionUpdateRenderStateError] {
  XRSession::update_render_state_with_state_ffi(self, state.to_js())
}

///|
pub extern "js" fn XRSession::update_target_frame_rate(
  self : XRSession,
  rate : Double,
) -> Promise[Unit] =
  #| (self, rate) => self.updateTargetFrameRate(rate)

///|
pub extern "js" fn XRSession::request_reference_space(
  self : XRSession,
  type_ : XRReferenceSpaceType,
) -> Promise[Result[XRReferenceSpace, XRSessionRequestReferenceSpaceError]] =
  #| (self, type_) => self.requestReferenceSpace(['viewer', 'local', 'local-floor', 'bounded-floor', 'unbounded'][type_]).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'NotSupportedError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }))

///|
pub extern "js" fn XRSession::request_animation_frame(
  self : XRSession,
  callback : XRFrameRequestCallback,
) -> Int =
  #| (self, callback) => self.requestAnimationFrame(callback)

///|
pub extern "js" fn XRSession::cancel_animation_frame(
  self : XRSession,
  handle : Int,
) -> Unit =
  #| (self, handle) => self.cancelAnimationFrame(handle)

///|
pub extern "js" fn XRSession::end(self : XRSession) -> Promise[Unit] =
  #| (self) => self.end()

///|
pub extern "js" fn XRSession::set_onend(
  self : XRSession,
  handler : (XRSessionEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onend = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onend(self : XRSession) -> Unit =
  #| (self) => { self.onend = null }

///|
pub extern "js" fn XRSession::set_oninputsourceschange(
  self : XRSession,
  handler : (XRInputSourcesChangeEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.oninputsourceschange = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_oninputsourceschange(
  self : XRSession,
) -> Unit =
  #| (self) => { self.oninputsourceschange = null }

///|
pub extern "js" fn XRSession::set_onselect(
  self : XRSession,
  handler : (XRInputSourceEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onselect = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onselect(self : XRSession) -> Unit =
  #| (self) => { self.onselect = null }

///|
pub extern "js" fn XRSession::set_onselectstart(
  self : XRSession,
  handler : (XRInputSourceEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onselectstart = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onselectstart(self : XRSession) -> Unit =
  #| (self) => { self.onselectstart = null }

///|
pub extern "js" fn XRSession::set_onselectend(
  self : XRSession,
  handler : (XRInputSourceEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onselectend = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onselectend(self : XRSession) -> Unit =
  #| (self) => { self.onselectend = null }

///|
pub extern "js" fn XRSession::set_onsqueeze(
  self : XRSession,
  handler : (XRInputSourceEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onsqueeze = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onsqueeze(self : XRSession) -> Unit =
  #| (self) => { self.onsqueeze = null }

///|
pub extern "js" fn XRSession::set_onsqueezestart(
  self : XRSession,
  handler : (XRInputSourceEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onsqueezestart = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onsqueezestart(self : XRSession) -> Unit =
  #| (self) => { self.onsqueezestart = null }

///|
pub extern "js" fn XRSession::set_onsqueezeend(
  self : XRSession,
  handler : (XRInputSourceEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onsqueezeend = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onsqueezeend(self : XRSession) -> Unit =
  #| (self) => { self.onsqueezeend = null }

///|
pub extern "js" fn XRSession::set_onvisibilitychange(
  self : XRSession,
  handler : (XRSessionEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onvisibilitychange = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onvisibilitychange(
  self : XRSession,
) -> Unit =
  #| (self) => { self.onvisibilitychange = null }

///|
pub extern "js" fn XRSession::set_onframeratechange(
  self : XRSession,
  handler : (Event) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onframeratechange = (e) => handler(e) }

///|
pub extern "js" fn XRSession::clear_onframeratechange(self : XRSession) -> Unit =
  #| (self) => { self.onframeratechange = null }

///|
pub extern "js" fn XRSession::get_persistent_anchors(
  self : XRSession,
) -> Array[String] =
  #| (self) => self.persistentAnchors

///|
pub extern "js" fn XRSession::restore_persistent_anchor(
  self : XRSession,
  uuid : String,
) -> Promise[XRAnchor] =
  #| (self, uuid) => self.restorePersistentAnchor(uuid)

///|
pub extern "js" fn XRSession::delete_persistent_anchor(
  self : XRSession,
  uuid : String,
) -> Promise[Unit] =
  #| (self, uuid) => self.deletePersistentAnchor(uuid)

///|
pub extern "js" fn XRSession::get_environment_blend_mode(
  self : XRSession,
) -> XREnvironmentBlendMode =
  #| (self) => ['opaque', 'alpha-blend', 'additive'].indexOf(self.environmentBlendMode)

///|
pub extern "js" fn XRSession::get_interaction_mode(
  self : XRSession,
) -> XRInteractionMode =
  #| (self) => ['screen-space', 'world-space'].indexOf(self.interactionMode)

///|
pub extern "js" fn XRSession::get_depth_usage(self : XRSession) -> XRDepthUsage =
  #| (self) => ['cpu-optimized', 'gpu-optimized'].indexOf(self.depthUsage)

///|
pub extern "js" fn XRSession::get_depth_data_format(
  self : XRSession,
) -> XRDepthDataFormat =
  #| (self) => ['luminance-alpha', 'float32', 'unsigned-short'].indexOf(self.depthDataFormat)

///|
pub extern "js" fn XRSession::get_depth_type(self : XRSession) -> XRDepthType? =
  #| (self) => (() => { const v = self.depthType; return v == null ? undefined : ['raw', 'smooth'].indexOf(v); })()

///|
pub extern "js" fn XRSession::get_depth_active(self : XRSession) -> Bool? =
  #| (self) => (self.depthActive) ?? undefined

///|
pub extern "js" fn XRSession::pause_depth_sensing(self : XRSession) -> Unit =
  #| (self) => self.pauseDepthSensing()

///|
pub extern "js" fn XRSession::resume_depth_sensing(self : XRSession) -> Unit =
  #| (self) => self.resumeDepthSensing()

///|
pub extern "js" fn XRSession::get_dom_overlay_state(
  self : XRSession,
) -> XRDOMOverlayState? =
  #| (self) => (() => { const v = self.domOverlayState; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
extern "js" fn XRSession::request_hit_test_source_ffi(
  self : XRSession,
  options : JsValue,
) -> Promise[Result[XRHitTestSource, XRSessionRequestHitTestSourceError]] =
  #| (self, options) => self.requestHitTestSource(options).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'NotAllowedError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; if (n === 'NotSupportedError') return { $tag: 2, _0: e }; return { $tag: 3, _0: e }; })() }))

///|
pub fn XRSession::request_hit_test_source(
  self : XRSession,
  options : XRHitTestOptionsInit,
) -> Promise[Result[XRHitTestSource, XRSessionRequestHitTestSourceError]] {
  XRSession::request_hit_test_source_ffi(self, options.to_js())
}

///|
extern "js" fn XRSession::request_hit_test_source_for_transient_input_ffi(
  self : XRSession,
  options : JsValue,
) -> Promise[
  Result[
    XRTransientInputHitTestSource,
    XRSessionRequestHitTestSourceForTransientInputError,
  ],
] =
  #| (self, options) => self.requestHitTestSourceForTransientInput(options).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'NotAllowedError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; if (n === 'NotSupportedError') return { $tag: 2, _0: e }; return { $tag: 3, _0: e }; })() }))

///|
pub fn XRSession::request_hit_test_source_for_transient_input(
  self : XRSession,
  options : XRTransientInputHitTestOptionsInit,
) -> Promise[
  Result[
    XRTransientInputHitTestSource,
    XRSessionRequestHitTestSourceForTransientInputError,
  ],
] {
  XRSession::request_hit_test_source_for_transient_input_ffi(
    self,
    options.to_js(),
  )
}

///|
pub extern "js" fn XRSession::request_light_probe(
  self : XRSession,
) -> Promise[Result[XRLightProbe, XRSessionRequestLightProbeError]] =
  #| (self) => self.requestLightProbe().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; if (n === 'NotSupportedError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }))

///|
extern "js" fn XRSession::request_light_probe_with_options_ffi(
  self : XRSession,
  options : JsValue,
) -> Promise[Result[XRLightProbe, XRSessionRequestLightProbeError]] =
  #| (self, options) => self.requestLightProbe(options).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; if (n === 'NotSupportedError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }))

///|
pub fn XRSession::request_light_probe_with_options(
  self : XRSession,
  options : XRLightProbeInit,
) -> Promise[Result[XRLightProbe, XRSessionRequestLightProbeError]] {
  XRSession::request_light_probe_with_options_ffi(self, options.to_js())
}

///|
pub extern "js" fn XRSession::get_preferred_reflection_format(
  self : XRSession,
) -> XRReflectionFormat =
  #| (self) => ['srgba8', 'rgba16f'].indexOf(self.preferredReflectionFormat)

///|
pub extern "js" fn XRSession::initiate_room_capture(
  self : XRSession,
) -> Promise[Unit] =
  #| (self) => self.initiateRoomCapture()

///|
pub extern "js" fn XRSession::get_max_render_layers(self : XRSession) -> Int =
  #| (self) => self.maxRenderLayers

///|
/// XRRenderState interface
pub type XRRenderState

///|
pub extern "js" fn XRRenderState::to_js_value(self : XRRenderState) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRRenderState (unchecked)
pub extern "js" fn XRRenderState::from_js_value(v : JsValue) -> XRRenderState =
  #| (v) => v

///|
/// Safely cast JsValue to XRRenderState (checked with instanceof)
pub extern "js" fn XRRenderState::from_js_value_opt(
  v : JsValue,
) -> XRRenderState? =
  #| (v) => (v instanceof XRRenderState) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRRenderState (checked with instanceof)
pub extern "js" fn JsValue::as_xr_render_state(
  self : JsValue,
) -> XRRenderState? =
  #| (self) => (self instanceof XRRenderState) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRRenderState (unchecked)
pub extern "js" fn JsValue::to_xr_render_state(self : JsValue) -> XRRenderState =
  #| (self) => self

///|
pub extern "js" fn XRRenderState::get_depth_near(
  self : XRRenderState,
) -> Double =
  #| (self) => self.depthNear

///|
pub extern "js" fn XRRenderState::get_depth_far(self : XRRenderState) -> Double =
  #| (self) => self.depthFar

///|
pub extern "js" fn XRRenderState::get_passthrough_fully_obscured(
  self : XRRenderState,
) -> Bool? =
  #| (self) => (self.passthroughFullyObscured) ?? undefined

///|
pub extern "js" fn XRRenderState::get_inline_vertical_field_of_view(
  self : XRRenderState,
) -> Double? =
  #| (self) => (() => { const v = self.inlineVerticalFieldOfView; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRRenderState::get_base_layer(
  self : XRRenderState,
) -> XRWebGLLayer? =
  #| (self) => (() => { const v = self.baseLayer; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRRenderState::get_layers(
  self : XRRenderState,
) -> Array[XRLayer] =
  #| (self) => self.layers

///|
/// XRFrame interface
pub type XRFrame

///|
pub extern "js" fn XRFrame::to_js_value(self : XRFrame) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRFrame (unchecked)
pub extern "js" fn XRFrame::from_js_value(v : JsValue) -> XRFrame =
  #| (v) => v

///|
/// Safely cast JsValue to XRFrame (checked with instanceof)
pub extern "js" fn XRFrame::from_js_value_opt(v : JsValue) -> XRFrame? =
  #| (v) => (v instanceof XRFrame) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRFrame (checked with instanceof)
pub extern "js" fn JsValue::as_xr_frame(self : JsValue) -> XRFrame? =
  #| (self) => (self instanceof XRFrame) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRFrame (unchecked)
pub extern "js" fn JsValue::to_xr_frame(self : JsValue) -> XRFrame =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum XRFrameGetViewerPoseError {
  InvalidStateError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRFrameGetDepthInformationError {
  InvalidStateError(JsError)
  NotSupportedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRFrameFillJointRadiiError {
  TypeError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRFrameFillPosesError {
  TypeError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn XRFrame::get_session(self : XRFrame) -> XRSession =
  #| (self) => self.session

///|
pub extern "js" fn XRFrame::get_predicted_display_time(
  self : XRFrame,
) -> DOMHighResTimeStamp =
  #| (self) => self.predictedDisplayTime

///|
pub extern "js" fn XRFrame::get_viewer_pose(
  self : XRFrame,
  reference_space : XRReferenceSpace,
) -> Result[XRViewerPose?, XRFrameGetViewerPoseError] =
  #| (self, reference_space) => (() => { try { return { $tag: 1, _0: (() => { const v = self.getViewerPose(reference_space); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRFrame::get_pose(
  self : XRFrame,
  space : XRSpace,
  base_space : XRSpace,
) -> XRPose? =
  #| (self, space, base_space) => (() => { const v = self.getPose(space, base_space); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRFrame::create_anchor(
  self : XRFrame,
  pose : XRRigidTransform,
  space : XRSpace,
) -> Promise[XRAnchor] =
  #| (self, pose, space) => self.createAnchor(pose, space)

///|
pub extern "js" fn XRFrame::get_tracked_anchors(self : XRFrame) -> XRAnchorSet =
  #| (self) => self.trackedAnchors

///|
pub extern "js" fn XRFrame::get_body(self : XRFrame) -> XRBody? =
  #| (self) => (() => { const v = self.body; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRFrame::get_detected_meshes(self : XRFrame) -> XRMeshSet =
  #| (self) => self.detectedMeshes

///|
pub extern "js" fn XRFrame::get_depth_information(
  self : XRFrame,
  view : XRView,
) -> Result[XRCPUDepthInformation?, XRFrameGetDepthInformationError] =
  #| (self, view) => (() => { try { return { $tag: 1, _0: (() => { const v = self.getDepthInformation(view); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; if (n === 'NotSupportedError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub extern "js" fn XRFrame::get_joint_pose(
  self : XRFrame,
  joint : XRJointSpace,
  base_space : XRSpace,
) -> XRJointPose? =
  #| (self, joint, base_space) => (() => { const v = self.getJointPose(joint, base_space); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRFrame::fill_joint_radii(
  self : XRFrame,
  joint_spaces : Array[XRJointSpace],
  radii : Float32Array,
) -> Result[Bool, XRFrameFillJointRadiiError] =
  #| (self, joint_spaces, radii) => (() => { try { return { $tag: 1, _0: self.fillJointRadii(joint_spaces, radii) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRFrame::fill_poses(
  self : XRFrame,
  spaces : Array[XRSpace],
  base_space : XRSpace,
  transforms : Float32Array,
) -> Result[Bool, XRFrameFillPosesError] =
  #| (self, spaces, base_space, transforms) => (() => { try { return { $tag: 1, _0: self.fillPoses(spaces, base_space, transforms) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRFrame::get_hit_test_results(
  self : XRFrame,
  hit_test_source : XRHitTestSource,
) -> Array[XRHitTestResult] =
  #| (self, hit_test_source) => self.getHitTestResults(hit_test_source)

///|
pub extern "js" fn XRFrame::get_hit_test_results_for_transient_input(
  self : XRFrame,
  hit_test_source : XRTransientInputHitTestSource,
) -> Array[XRTransientInputHitTestResult] =
  #| (self, hit_test_source) => self.getHitTestResultsForTransientInput(hit_test_source)

///|
pub extern "js" fn XRFrame::get_light_estimate(
  self : XRFrame,
  light_probe : XRLightProbe,
) -> XRLightEstimate? =
  #| (self, light_probe) => (() => { const v = self.getLightEstimate(light_probe); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRFrame::get_detected_planes(self : XRFrame) -> XRPlaneSet =
  #| (self) => self.detectedPlanes

///|
/// XRSpace interface
pub type XRSpace

///|
pub extern "js" fn XRSpace::to_js_value(self : XRSpace) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRSpace (unchecked)
pub extern "js" fn XRSpace::from_js_value(v : JsValue) -> XRSpace =
  #| (v) => v

///|
/// Safely cast JsValue to XRSpace (checked with instanceof)
pub extern "js" fn XRSpace::from_js_value_opt(v : JsValue) -> XRSpace? =
  #| (v) => (v instanceof XRSpace) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRSpace (checked with instanceof)
pub extern "js" fn JsValue::as_xr_space(self : JsValue) -> XRSpace? =
  #| (self) => (self instanceof XRSpace) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRSpace (unchecked)
pub extern "js" fn JsValue::to_xr_space(self : JsValue) -> XRSpace =
  #| (self) => self

///|
pub extern "js" fn XRSpace::to_event_target(self : XRSpace) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRSpace::as_xr_body_space(self : XRSpace) -> XRBodySpace? =
  #| (self) => (self instanceof XRBodySpace) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRSpace::as_xr_joint_space(self : XRSpace) -> XRJointSpace? =
  #| (self) => (self instanceof XRJointSpace) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRSpace::as_xr_reference_space(
  self : XRSpace,
) -> XRReferenceSpace? =
  #| (self) => (self instanceof XRReferenceSpace) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRSpace::as_xr_bounded_reference_space(
  self : XRSpace,
) -> XRBoundedReferenceSpace? =
  #| (self) => (self instanceof XRBoundedReferenceSpace) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// XRReferenceSpace interface
pub type XRReferenceSpace

///|
pub extern "js" fn XRReferenceSpace::to_js_value(
  self : XRReferenceSpace,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRReferenceSpace (unchecked)
pub extern "js" fn XRReferenceSpace::from_js_value(
  v : JsValue,
) -> XRReferenceSpace =
  #| (v) => v

///|
/// Safely cast JsValue to XRReferenceSpace (checked with instanceof)
pub extern "js" fn XRReferenceSpace::from_js_value_opt(
  v : JsValue,
) -> XRReferenceSpace? =
  #| (v) => (v instanceof XRReferenceSpace) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRReferenceSpace (checked with instanceof)
pub extern "js" fn JsValue::as_xr_reference_space(
  self : JsValue,
) -> XRReferenceSpace? =
  #| (self) => (self instanceof XRReferenceSpace) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRReferenceSpace (unchecked)
pub extern "js" fn JsValue::to_xr_reference_space(
  self : JsValue,
) -> XRReferenceSpace =
  #| (self) => self

///|
pub extern "js" fn XRReferenceSpace::to_xr_space(
  self : XRReferenceSpace,
) -> XRSpace =
  #| (self) => self

///|
pub extern "js" fn XRReferenceSpace::to_event_target(
  self : XRReferenceSpace,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRReferenceSpace::as_xr_bounded_reference_space(
  self : XRReferenceSpace,
) -> XRBoundedReferenceSpace? =
  #| (self) => (self instanceof XRBoundedReferenceSpace) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRReferenceSpace::get_offset_reference_space(
  self : XRReferenceSpace,
  origin_offset : XRRigidTransform,
) -> XRReferenceSpace =
  #| (self, origin_offset) => self.getOffsetReferenceSpace(origin_offset)

///|
pub extern "js" fn XRReferenceSpace::set_onreset(
  self : XRReferenceSpace,
  handler : (XRReferenceSpaceEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onreset = (e) => handler(e) }

///|
pub extern "js" fn XRReferenceSpace::clear_onreset(
  self : XRReferenceSpace,
) -> Unit =
  #| (self) => { self.onreset = null }

///|
/// XRBoundedReferenceSpace interface
pub type XRBoundedReferenceSpace

///|
pub extern "js" fn XRBoundedReferenceSpace::to_js_value(
  self : XRBoundedReferenceSpace,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRBoundedReferenceSpace (unchecked)
pub extern "js" fn XRBoundedReferenceSpace::from_js_value(
  v : JsValue,
) -> XRBoundedReferenceSpace =
  #| (v) => v

///|
/// Safely cast JsValue to XRBoundedReferenceSpace (checked with instanceof)
pub extern "js" fn XRBoundedReferenceSpace::from_js_value_opt(
  v : JsValue,
) -> XRBoundedReferenceSpace? =
  #| (v) => (v instanceof XRBoundedReferenceSpace) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRBoundedReferenceSpace (checked with instanceof)
pub extern "js" fn JsValue::as_xr_bounded_reference_space(
  self : JsValue,
) -> XRBoundedReferenceSpace? =
  #| (self) => (self instanceof XRBoundedReferenceSpace) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRBoundedReferenceSpace (unchecked)
pub extern "js" fn JsValue::to_xr_bounded_reference_space(
  self : JsValue,
) -> XRBoundedReferenceSpace =
  #| (self) => self

///|
pub extern "js" fn XRBoundedReferenceSpace::to_xr_reference_space(
  self : XRBoundedReferenceSpace,
) -> XRReferenceSpace =
  #| (self) => self

///|
pub extern "js" fn XRBoundedReferenceSpace::to_xr_space(
  self : XRBoundedReferenceSpace,
) -> XRSpace =
  #| (self) => self

///|
pub extern "js" fn XRBoundedReferenceSpace::to_event_target(
  self : XRBoundedReferenceSpace,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRBoundedReferenceSpace::get_bounds_geometry(
  self : XRBoundedReferenceSpace,
) -> Array[DOMPointReadOnly] =
  #| (self) => self.boundsGeometry

///|
/// XRView interface
pub type XRView

///|
pub extern "js" fn XRView::to_js_value(self : XRView) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRView (unchecked)
pub extern "js" fn XRView::from_js_value(v : JsValue) -> XRView =
  #| (v) => v

///|
/// Safely cast JsValue to XRView (checked with instanceof)
pub extern "js" fn XRView::from_js_value_opt(v : JsValue) -> XRView? =
  #| (v) => (v instanceof XRView) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRView (checked with instanceof)
pub extern "js" fn JsValue::as_xr_view(self : JsValue) -> XRView? =
  #| (self) => (self instanceof XRView) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRView (unchecked)
pub extern "js" fn JsValue::to_xr_view(self : JsValue) -> XRView =
  #| (self) => self

///|
pub extern "js" fn XRView::get_eye(self : XRView) -> XREye =
  #| (self) => ['none', 'left', 'right'].indexOf(self.eye)

///|
pub extern "js" fn XRView::get_index(self : XRView) -> Int =
  #| (self) => self.index

///|
pub extern "js" fn XRView::get_recommended_viewport_scale(
  self : XRView,
) -> Double? =
  #| (self) => (() => { const v = self.recommendedViewportScale; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRView::request_viewport_scale(
  self : XRView,
  scale : Double?,
) -> Unit =
  #| (self, scale) => self.requestViewportScale(scale)

///|
pub extern "js" fn XRView::get_camera(self : XRView) -> XRCamera? =
  #| (self) => (() => { const v = self.camera; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRView::get_is_first_person_observer(self : XRView) -> Bool =
  #| (self) => self.isFirstPersonObserver

///|
pub extern "js" fn XRView::get_projection_matrix(self : XRView) -> Float32Array =
  #| (self) => self.projectionMatrix

///|
pub extern "js" fn XRView::get_transform(self : XRView) -> XRRigidTransform =
  #| (self) => self.transform

///|
/// XRViewport interface
pub type XRViewport

///|
pub extern "js" fn XRViewport::to_js_value(self : XRViewport) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRViewport (unchecked)
pub extern "js" fn XRViewport::from_js_value(v : JsValue) -> XRViewport =
  #| (v) => v

///|
/// Safely cast JsValue to XRViewport (checked with instanceof)
pub extern "js" fn XRViewport::from_js_value_opt(v : JsValue) -> XRViewport? =
  #| (v) => (v instanceof XRViewport) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRViewport (checked with instanceof)
pub extern "js" fn JsValue::as_xr_viewport(self : JsValue) -> XRViewport? =
  #| (self) => (self instanceof XRViewport) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRViewport (unchecked)
pub extern "js" fn JsValue::to_xr_viewport(self : JsValue) -> XRViewport =
  #| (self) => self

///|
pub extern "js" fn XRViewport::get_x(self : XRViewport) -> Int =
  #| (self) => self.x

///|
pub extern "js" fn XRViewport::get_y(self : XRViewport) -> Int =
  #| (self) => self.y

///|
pub extern "js" fn XRViewport::get_width(self : XRViewport) -> Int =
  #| (self) => self.width

///|
pub extern "js" fn XRViewport::get_height(self : XRViewport) -> Int =
  #| (self) => self.height

///|
/// XRRigidTransform interface
pub type XRRigidTransform

///|
pub extern "js" fn XRRigidTransform::to_js_value(
  self : XRRigidTransform,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRRigidTransform (unchecked)
pub extern "js" fn XRRigidTransform::from_js_value(
  v : JsValue,
) -> XRRigidTransform =
  #| (v) => v

///|
/// Safely cast JsValue to XRRigidTransform (checked with instanceof)
pub extern "js" fn XRRigidTransform::from_js_value_opt(
  v : JsValue,
) -> XRRigidTransform? =
  #| (v) => (v instanceof XRRigidTransform) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRRigidTransform (checked with instanceof)
pub extern "js" fn JsValue::as_xr_rigid_transform(
  self : JsValue,
) -> XRRigidTransform? =
  #| (self) => (self instanceof XRRigidTransform) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRRigidTransform (unchecked)
pub extern "js" fn JsValue::to_xr_rigid_transform(
  self : JsValue,
) -> XRRigidTransform =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum XRRigidTransformConstructorError {
  TypeError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn XRRigidTransform::new() -> Result[
  XRRigidTransform,
  XRRigidTransformConstructorError,
] =
  #| () => (() => { try { return { $tag: 1, _0: new XRRigidTransform() }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
extern "js" fn XRRigidTransform::new_with_orientation_ffi(
  position : JsValue,
  orientation : JsValue,
) -> Result[XRRigidTransform, XRRigidTransformConstructorError] =
  #| (position, orientation) => (() => { try { return { $tag: 1, _0: new XRRigidTransform(position, orientation) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub fn XRRigidTransform::new_with_orientation(
  position : DOMPointInit,
  orientation : DOMPointInit,
) -> Result[XRRigidTransform, XRRigidTransformConstructorError] {
  XRRigidTransform::new_with_orientation_ffi(
    position.to_js(),
    orientation.to_js(),
  )
}

///|
pub extern "js" fn XRRigidTransform::get_position(
  self : XRRigidTransform,
) -> DOMPointReadOnly =
  #| (self) => self.position

///|
pub extern "js" fn XRRigidTransform::get_orientation(
  self : XRRigidTransform,
) -> DOMPointReadOnly =
  #| (self) => self.orientation

///|
pub extern "js" fn XRRigidTransform::get_matrix(
  self : XRRigidTransform,
) -> Float32Array =
  #| (self) => self.matrix

///|
pub extern "js" fn XRRigidTransform::get_inverse(
  self : XRRigidTransform,
) -> XRRigidTransform =
  #| (self) => self.inverse

///|
/// XRPose interface
pub type XRPose

///|
pub extern "js" fn XRPose::to_js_value(self : XRPose) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRPose (unchecked)
pub extern "js" fn XRPose::from_js_value(v : JsValue) -> XRPose =
  #| (v) => v

///|
/// Safely cast JsValue to XRPose (checked with instanceof)
pub extern "js" fn XRPose::from_js_value_opt(v : JsValue) -> XRPose? =
  #| (v) => (v instanceof XRPose) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRPose (checked with instanceof)
pub extern "js" fn JsValue::as_xr_pose(self : JsValue) -> XRPose? =
  #| (self) => (self instanceof XRPose) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRPose (unchecked)
pub extern "js" fn JsValue::to_xr_pose(self : JsValue) -> XRPose =
  #| (self) => self

///|
pub extern "js" fn XRPose::as_xr_joint_pose(self : XRPose) -> XRJointPose? =
  #| (self) => (self instanceof XRJointPose) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRPose::as_xr_viewer_pose(self : XRPose) -> XRViewerPose? =
  #| (self) => (self instanceof XRViewerPose) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRPose::get_transform(self : XRPose) -> XRRigidTransform =
  #| (self) => self.transform

///|
pub extern "js" fn XRPose::get_linear_velocity(
  self : XRPose,
) -> DOMPointReadOnly? =
  #| (self) => (() => { const v = self.linearVelocity; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRPose::get_angular_velocity(
  self : XRPose,
) -> DOMPointReadOnly? =
  #| (self) => (() => { const v = self.angularVelocity; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRPose::get_emulated_position(self : XRPose) -> Bool =
  #| (self) => self.emulatedPosition

///|
/// XRViewerPose interface
pub type XRViewerPose

///|
pub extern "js" fn XRViewerPose::to_js_value(self : XRViewerPose) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRViewerPose (unchecked)
pub extern "js" fn XRViewerPose::from_js_value(v : JsValue) -> XRViewerPose =
  #| (v) => v

///|
/// Safely cast JsValue to XRViewerPose (checked with instanceof)
pub extern "js" fn XRViewerPose::from_js_value_opt(
  v : JsValue,
) -> XRViewerPose? =
  #| (v) => (v instanceof XRViewerPose) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRViewerPose (checked with instanceof)
pub extern "js" fn JsValue::as_xr_viewer_pose(self : JsValue) -> XRViewerPose? =
  #| (self) => (self instanceof XRViewerPose) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRViewerPose (unchecked)
pub extern "js" fn JsValue::to_xr_viewer_pose(self : JsValue) -> XRViewerPose =
  #| (self) => self

///|
pub extern "js" fn XRViewerPose::to_xr_pose(self : XRViewerPose) -> XRPose =
  #| (self) => self

///|
pub extern "js" fn XRViewerPose::get_views(
  self : XRViewerPose,
) -> Array[XRView] =
  #| (self) => self.views

///|
/// XRInputSource interface
pub type XRInputSource

///|
pub extern "js" fn XRInputSource::to_js_value(self : XRInputSource) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRInputSource (unchecked)
pub extern "js" fn XRInputSource::from_js_value(v : JsValue) -> XRInputSource =
  #| (v) => v

///|
/// Safely cast JsValue to XRInputSource (checked with instanceof)
pub extern "js" fn XRInputSource::from_js_value_opt(
  v : JsValue,
) -> XRInputSource? =
  #| (v) => (v instanceof XRInputSource) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRInputSource (checked with instanceof)
pub extern "js" fn JsValue::as_xr_input_source(
  self : JsValue,
) -> XRInputSource? =
  #| (self) => (self instanceof XRInputSource) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRInputSource (unchecked)
pub extern "js" fn JsValue::to_xr_input_source(self : JsValue) -> XRInputSource =
  #| (self) => self

///|
pub extern "js" fn XRInputSource::get_handedness(
  self : XRInputSource,
) -> XRHandedness =
  #| (self) => ['none', 'left', 'right'].indexOf(self.handedness)

///|
pub extern "js" fn XRInputSource::get_target_ray_mode(
  self : XRInputSource,
) -> XRTargetRayMode =
  #| (self) => ['gaze', 'tracked-pointer', 'screen', 'transient-pointer'].indexOf(self.targetRayMode)

///|
pub extern "js" fn XRInputSource::get_target_ray_space(
  self : XRInputSource,
) -> XRSpace =
  #| (self) => self.targetRaySpace

///|
pub extern "js" fn XRInputSource::get_grip_space(
  self : XRInputSource,
) -> XRSpace? =
  #| (self) => (() => { const v = self.gripSpace; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRInputSource::get_profiles(
  self : XRInputSource,
) -> Array[String] =
  #| (self) => self.profiles

///|
pub extern "js" fn XRInputSource::get_skip_rendering(
  self : XRInputSource,
) -> Bool =
  #| (self) => self.skipRendering

///|
pub extern "js" fn XRInputSource::get_gamepad(self : XRInputSource) -> Gamepad? =
  #| (self) => (() => { const v = self.gamepad; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRInputSource::get_hand(self : XRInputSource) -> XRHand? =
  #| (self) => (() => { const v = self.hand; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
/// XRInputSourceArray interface
pub type XRInputSourceArray

///|
pub extern "js" fn XRInputSourceArray::to_js_value(
  self : XRInputSourceArray,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRInputSourceArray (unchecked)
pub extern "js" fn XRInputSourceArray::from_js_value(
  v : JsValue,
) -> XRInputSourceArray =
  #| (v) => v

///|
/// Safely cast JsValue to XRInputSourceArray (checked with instanceof)
pub extern "js" fn XRInputSourceArray::from_js_value_opt(
  v : JsValue,
) -> XRInputSourceArray? =
  #| (v) => (v instanceof XRInputSourceArray) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRInputSourceArray (checked with instanceof)
pub extern "js" fn JsValue::as_xr_input_source_array(
  self : JsValue,
) -> XRInputSourceArray? =
  #| (self) => (self instanceof XRInputSourceArray) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRInputSourceArray (unchecked)
pub extern "js" fn JsValue::to_xr_input_source_array(
  self : JsValue,
) -> XRInputSourceArray =
  #| (self) => self

///|
pub extern "js" fn XRInputSourceArray::keys(
  self : XRInputSourceArray,
) -> JsValue =
  #| (self) => self.keys()

///|
pub extern "js" fn XRInputSourceArray::values(
  self : XRInputSourceArray,
) -> JsValue =
  #| (self) => self.values()

///|
pub extern "js" fn XRInputSourceArray::entries(
  self : XRInputSourceArray,
) -> JsValue =
  #| (self) => self.entries()

///|
pub extern "js" fn XRInputSourceArray::for_each(
  self : XRInputSourceArray,
  callback : JsValue,
) -> Unit =
  #| (self, callback) => { self.forEach(callback) }

///|
pub extern "js" fn XRInputSourceArray::get_length(
  self : XRInputSourceArray,
) -> Int =
  #| (self) => self.length

///|
#alias("_[_]")
pub extern "js" fn XRInputSourceArray::get(
  self : XRInputSourceArray,
  index : Int,
) -> XRInputSource =
  #| (self, index) => self[index]

///|
/// XRLayer interface
pub type XRLayer

///|
pub extern "js" fn XRLayer::to_js_value(self : XRLayer) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRLayer (unchecked)
pub extern "js" fn XRLayer::from_js_value(v : JsValue) -> XRLayer =
  #| (v) => v

///|
/// Safely cast JsValue to XRLayer (checked with instanceof)
pub extern "js" fn XRLayer::from_js_value_opt(v : JsValue) -> XRLayer? =
  #| (v) => (v instanceof XRLayer) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRLayer (checked with instanceof)
pub extern "js" fn JsValue::as_xr_layer(self : JsValue) -> XRLayer? =
  #| (self) => (self instanceof XRLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRLayer (unchecked)
pub extern "js" fn JsValue::to_xr_layer(self : JsValue) -> XRLayer =
  #| (self) => self

///|
pub extern "js" fn XRLayer::to_event_target(self : XRLayer) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRLayer::as_xr_web_gl_layer(self : XRLayer) -> XRWebGLLayer? =
  #| (self) => (self instanceof XRWebGLLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRLayer::as_xr_composition_layer(
  self : XRLayer,
) -> XRCompositionLayer? =
  #| (self) => (self instanceof XRCompositionLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRLayer::as_xr_projection_layer(
  self : XRLayer,
) -> XRProjectionLayer? =
  #| (self) => (self instanceof XRProjectionLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRLayer::as_xr_quad_layer(self : XRLayer) -> XRQuadLayer? =
  #| (self) => (self instanceof XRQuadLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRLayer::as_xr_cylinder_layer(
  self : XRLayer,
) -> XRCylinderLayer? =
  #| (self) => (self instanceof XRCylinderLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRLayer::as_xr_equirect_layer(
  self : XRLayer,
) -> XREquirectLayer? =
  #| (self) => (self instanceof XREquirectLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRLayer::as_xr_cube_layer(self : XRLayer) -> XRCubeLayer? =
  #| (self) => (self instanceof XRCubeLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// XRWebGLLayer interface
pub type XRWebGLLayer

///|
pub extern "js" fn XRWebGLLayer::to_js_value(self : XRWebGLLayer) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRWebGLLayer (unchecked)
pub extern "js" fn XRWebGLLayer::from_js_value(v : JsValue) -> XRWebGLLayer =
  #| (v) => v

///|
/// Safely cast JsValue to XRWebGLLayer (checked with instanceof)
pub extern "js" fn XRWebGLLayer::from_js_value_opt(
  v : JsValue,
) -> XRWebGLLayer? =
  #| (v) => (v instanceof XRWebGLLayer) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRWebGLLayer (checked with instanceof)
pub extern "js" fn JsValue::as_xr_web_gl_layer(self : JsValue) -> XRWebGLLayer? =
  #| (self) => (self instanceof XRWebGLLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRWebGLLayer (unchecked)
pub extern "js" fn JsValue::to_xr_web_gl_layer(self : JsValue) -> XRWebGLLayer =
  #| (self) => self

///|
pub extern "js" fn XRWebGLLayer::to_xr_layer(self : XRWebGLLayer) -> XRLayer =
  #| (self) => self

///|
pub extern "js" fn XRWebGLLayer::to_event_target(
  self : XRWebGLLayer,
) -> EventTarget =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum XRWebGLLayerConstructorError {
  OperationError(JsError)
  InvalidStateError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRWebGLLayerGetViewportError {
  InvalidStateError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn XRWebGLLayer::new(
  session : XRSession,
  context : XRWebGLRenderingContext,
) -> Result[XRWebGLLayer, XRWebGLLayerConstructorError] =
  #| (session, context) => (() => { try { return { $tag: 1, _0: new XRWebGLLayer(session, context) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'OperationError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
extern "js" fn XRWebGLLayer::new_with_layer_init_ffi(
  session : XRSession,
  context : XRWebGLRenderingContext,
  layer_init : JsValue,
) -> Result[XRWebGLLayer, XRWebGLLayerConstructorError] =
  #| (session, context, layer_init) => (() => { try { return { $tag: 1, _0: new XRWebGLLayer(session, context, layer_init) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'OperationError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub fn XRWebGLLayer::new_with_layer_init(
  session : XRSession,
  context : XRWebGLRenderingContext,
  layer_init : XRWebGLLayerInit,
) -> Result[XRWebGLLayer, XRWebGLLayerConstructorError] {
  XRWebGLLayer::new_with_layer_init_ffi(session, context, layer_init.to_js())
}

///|
pub extern "js" fn XRWebGLLayer::get_antialias(self : XRWebGLLayer) -> Bool =
  #| (self) => self.antialias

///|
pub extern "js" fn XRWebGLLayer::get_ignore_depth_values(
  self : XRWebGLLayer,
) -> Bool =
  #| (self) => self.ignoreDepthValues

///|
pub extern "js" fn XRWebGLLayer::get_fixed_foveation(
  self : XRWebGLLayer,
) -> Double? =
  #| (self) => (() => { const v = self.fixedFoveation; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRWebGLLayer::set_fixed_foveation(
  self : XRWebGLLayer,
  value : Double?,
) -> Unit =
  #| (self, value) => { self.fixedFoveation = value }

///|
pub extern "js" fn XRWebGLLayer::get_framebuffer(
  self : XRWebGLLayer,
) -> WebGLFramebuffer? =
  #| (self) => (() => { const v = self.framebuffer; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRWebGLLayer::get_framebuffer_width(
  self : XRWebGLLayer,
) -> Int =
  #| (self) => self.framebufferWidth

///|
pub extern "js" fn XRWebGLLayer::get_framebuffer_height(
  self : XRWebGLLayer,
) -> Int =
  #| (self) => self.framebufferHeight

///|
pub extern "js" fn XRWebGLLayer::get_viewport(
  self : XRWebGLLayer,
  view : XRView,
) -> Result[XRViewport?, XRWebGLLayerGetViewportError] =
  #| (self, view) => (() => { try { return { $tag: 1, _0: (() => { const v = self.getViewport(view); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRWebGLLayer::get_native_framebuffer_scale_factor(
  session : XRSession,
) -> Double =
  #| (session) => XRWebGLLayer.getNativeFramebufferScaleFactor(session)

///|
pub extern "js" fn XRWebGLLayer::new_with_web_gl_rendering_context(
  session : XRSession,
  context : WebGLRenderingContext,
  layer_init : XRWebGLLayerInit,
) -> Result[XRWebGLLayer, XRWebGLLayerConstructorError] =
  #| (session, context, layer_init) => (() => { try { return { $tag: 1, _0: new XRWebGLLayer(session, context, layer_init) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'OperationError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub extern "js" fn XRWebGLLayer::new_with_web_gl2_rendering_context(
  session : XRSession,
  context : WebGL2RenderingContext,
  layer_init : XRWebGLLayerInit,
) -> Result[XRWebGLLayer, XRWebGLLayerConstructorError] =
  #| (session, context, layer_init) => (() => { try { return { $tag: 1, _0: new XRWebGLLayer(session, context, layer_init) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'OperationError') return { $tag: 0, _0: e }; if (n === 'InvalidStateError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
/// XRSessionEvent interface
pub type XRSessionEvent

///|
pub extern "js" fn XRSessionEvent::to_js_value(
  self : XRSessionEvent,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRSessionEvent (unchecked)
pub extern "js" fn XRSessionEvent::from_js_value(v : JsValue) -> XRSessionEvent =
  #| (v) => v

///|
/// Safely cast JsValue to XRSessionEvent (checked with instanceof)
pub extern "js" fn XRSessionEvent::from_js_value_opt(
  v : JsValue,
) -> XRSessionEvent? =
  #| (v) => (v instanceof XRSessionEvent) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRSessionEvent (checked with instanceof)
pub extern "js" fn JsValue::as_xr_session_event(
  self : JsValue,
) -> XRSessionEvent? =
  #| (self) => (self instanceof XRSessionEvent) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRSessionEvent (unchecked)
pub extern "js" fn JsValue::to_xr_session_event(
  self : JsValue,
) -> XRSessionEvent =
  #| (self) => self

///|
pub extern "js" fn XRSessionEvent::to_event(self : XRSessionEvent) -> Event =
  #| (self) => self

///|
extern "js" fn XRSessionEvent::new_ffi(
  type_ : String,
  event_init_dict : JsValue,
) -> XRSessionEvent =
  #| (type_, event_init_dict) => new XRSessionEvent(type_, event_init_dict)

///|
pub fn XRSessionEvent::new(
  type_ : String,
  event_init_dict : XRSessionEventInit,
) -> XRSessionEvent {
  XRSessionEvent::new_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn XRSessionEvent::get_session(
  self : XRSessionEvent,
) -> XRSession =
  #| (self) => self.session

///|
/// XRInputSourceEvent interface
pub type XRInputSourceEvent

///|
pub extern "js" fn XRInputSourceEvent::to_js_value(
  self : XRInputSourceEvent,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRInputSourceEvent (unchecked)
pub extern "js" fn XRInputSourceEvent::from_js_value(
  v : JsValue,
) -> XRInputSourceEvent =
  #| (v) => v

///|
/// Safely cast JsValue to XRInputSourceEvent (checked with instanceof)
pub extern "js" fn XRInputSourceEvent::from_js_value_opt(
  v : JsValue,
) -> XRInputSourceEvent? =
  #| (v) => (v instanceof XRInputSourceEvent) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRInputSourceEvent (checked with instanceof)
pub extern "js" fn JsValue::as_xr_input_source_event(
  self : JsValue,
) -> XRInputSourceEvent? =
  #| (self) => (self instanceof XRInputSourceEvent) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRInputSourceEvent (unchecked)
pub extern "js" fn JsValue::to_xr_input_source_event(
  self : JsValue,
) -> XRInputSourceEvent =
  #| (self) => self

///|
pub extern "js" fn XRInputSourceEvent::to_event(
  self : XRInputSourceEvent,
) -> Event =
  #| (self) => self

///|
extern "js" fn XRInputSourceEvent::new_ffi(
  type_ : String,
  event_init_dict : JsValue,
) -> XRInputSourceEvent =
  #| (type_, event_init_dict) => new XRInputSourceEvent(type_, event_init_dict)

///|
pub fn XRInputSourceEvent::new(
  type_ : String,
  event_init_dict : XRInputSourceEventInit,
) -> XRInputSourceEvent {
  XRInputSourceEvent::new_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn XRInputSourceEvent::get_frame(
  self : XRInputSourceEvent,
) -> XRFrame =
  #| (self) => self.frame

///|
pub extern "js" fn XRInputSourceEvent::get_input_source(
  self : XRInputSourceEvent,
) -> XRInputSource =
  #| (self) => self.inputSource

///|
/// XRInputSourcesChangeEvent interface
pub type XRInputSourcesChangeEvent

///|
pub extern "js" fn XRInputSourcesChangeEvent::to_js_value(
  self : XRInputSourcesChangeEvent,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRInputSourcesChangeEvent (unchecked)
pub extern "js" fn XRInputSourcesChangeEvent::from_js_value(
  v : JsValue,
) -> XRInputSourcesChangeEvent =
  #| (v) => v

///|
/// Safely cast JsValue to XRInputSourcesChangeEvent (checked with instanceof)
pub extern "js" fn XRInputSourcesChangeEvent::from_js_value_opt(
  v : JsValue,
) -> XRInputSourcesChangeEvent? =
  #| (v) => (v instanceof XRInputSourcesChangeEvent) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRInputSourcesChangeEvent (checked with instanceof)
pub extern "js" fn JsValue::as_xr_input_sources_change_event(
  self : JsValue,
) -> XRInputSourcesChangeEvent? =
  #| (self) => (self instanceof XRInputSourcesChangeEvent) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRInputSourcesChangeEvent (unchecked)
pub extern "js" fn JsValue::to_xr_input_sources_change_event(
  self : JsValue,
) -> XRInputSourcesChangeEvent =
  #| (self) => self

///|
pub extern "js" fn XRInputSourcesChangeEvent::to_event(
  self : XRInputSourcesChangeEvent,
) -> Event =
  #| (self) => self

///|
extern "js" fn XRInputSourcesChangeEvent::new_ffi(
  type_ : String,
  event_init_dict : JsValue,
) -> XRInputSourcesChangeEvent =
  #| (type_, event_init_dict) => new XRInputSourcesChangeEvent(type_, event_init_dict)

///|
pub fn XRInputSourcesChangeEvent::new(
  type_ : String,
  event_init_dict : XRInputSourcesChangeEventInit,
) -> XRInputSourcesChangeEvent {
  XRInputSourcesChangeEvent::new_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn XRInputSourcesChangeEvent::get_session(
  self : XRInputSourcesChangeEvent,
) -> XRSession =
  #| (self) => self.session

///|
pub extern "js" fn XRInputSourcesChangeEvent::get_added(
  self : XRInputSourcesChangeEvent,
) -> Array[XRInputSource] =
  #| (self) => self.added

///|
pub extern "js" fn XRInputSourcesChangeEvent::get_removed(
  self : XRInputSourcesChangeEvent,
) -> Array[XRInputSource] =
  #| (self) => self.removed

///|
/// XRReferenceSpaceEvent interface
pub type XRReferenceSpaceEvent

///|
pub extern "js" fn XRReferenceSpaceEvent::to_js_value(
  self : XRReferenceSpaceEvent,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRReferenceSpaceEvent (unchecked)
pub extern "js" fn XRReferenceSpaceEvent::from_js_value(
  v : JsValue,
) -> XRReferenceSpaceEvent =
  #| (v) => v

///|
/// Safely cast JsValue to XRReferenceSpaceEvent (checked with instanceof)
pub extern "js" fn XRReferenceSpaceEvent::from_js_value_opt(
  v : JsValue,
) -> XRReferenceSpaceEvent? =
  #| (v) => (v instanceof XRReferenceSpaceEvent) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRReferenceSpaceEvent (checked with instanceof)
pub extern "js" fn JsValue::as_xr_reference_space_event(
  self : JsValue,
) -> XRReferenceSpaceEvent? =
  #| (self) => (self instanceof XRReferenceSpaceEvent) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRReferenceSpaceEvent (unchecked)
pub extern "js" fn JsValue::to_xr_reference_space_event(
  self : JsValue,
) -> XRReferenceSpaceEvent =
  #| (self) => self

///|
pub extern "js" fn XRReferenceSpaceEvent::to_event(
  self : XRReferenceSpaceEvent,
) -> Event =
  #| (self) => self

///|
extern "js" fn XRReferenceSpaceEvent::new_ffi(
  type_ : String,
  event_init_dict : JsValue,
) -> XRReferenceSpaceEvent =
  #| (type_, event_init_dict) => new XRReferenceSpaceEvent(type_, event_init_dict)

///|
pub fn XRReferenceSpaceEvent::new(
  type_ : String,
  event_init_dict : XRReferenceSpaceEventInit,
) -> XRReferenceSpaceEvent {
  XRReferenceSpaceEvent::new_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn XRReferenceSpaceEvent::get_reference_space(
  self : XRReferenceSpaceEvent,
) -> XRReferenceSpace =
  #| (self) => self.referenceSpace

///|
pub extern "js" fn XRReferenceSpaceEvent::get_transform(
  self : XRReferenceSpaceEvent,
) -> XRRigidTransform? =
  #| (self) => (() => { const v = self.transform; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
/// XRVisibilityMaskChangeEvent interface
pub type XRVisibilityMaskChangeEvent

///|
pub extern "js" fn XRVisibilityMaskChangeEvent::to_js_value(
  self : XRVisibilityMaskChangeEvent,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRVisibilityMaskChangeEvent (unchecked)
pub extern "js" fn XRVisibilityMaskChangeEvent::from_js_value(
  v : JsValue,
) -> XRVisibilityMaskChangeEvent =
  #| (v) => v

///|
/// Safely cast JsValue to XRVisibilityMaskChangeEvent (checked with instanceof)
pub extern "js" fn XRVisibilityMaskChangeEvent::from_js_value_opt(
  v : JsValue,
) -> XRVisibilityMaskChangeEvent? =
  #| (v) => (v instanceof XRVisibilityMaskChangeEvent) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRVisibilityMaskChangeEvent (checked with instanceof)
pub extern "js" fn JsValue::as_xr_visibility_mask_change_event(
  self : JsValue,
) -> XRVisibilityMaskChangeEvent? =
  #| (self) => (self instanceof XRVisibilityMaskChangeEvent) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRVisibilityMaskChangeEvent (unchecked)
pub extern "js" fn JsValue::to_xr_visibility_mask_change_event(
  self : JsValue,
) -> XRVisibilityMaskChangeEvent =
  #| (self) => self

///|
pub extern "js" fn XRVisibilityMaskChangeEvent::to_event(
  self : XRVisibilityMaskChangeEvent,
) -> Event =
  #| (self) => self

///|
extern "js" fn XRVisibilityMaskChangeEvent::new_ffi(
  type_ : String,
  event_init_dict : JsValue,
) -> XRVisibilityMaskChangeEvent =
  #| (type_, event_init_dict) => new XRVisibilityMaskChangeEvent(type_, event_init_dict)

///|
pub fn XRVisibilityMaskChangeEvent::new(
  type_ : String,
  event_init_dict : XRVisibilityMaskChangeEventInit,
) -> XRVisibilityMaskChangeEvent {
  XRVisibilityMaskChangeEvent::new_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn XRVisibilityMaskChangeEvent::get_session(
  self : XRVisibilityMaskChangeEvent,
) -> XRSession =
  #| (self) => self.session

///|
pub extern "js" fn XRVisibilityMaskChangeEvent::get_eye(
  self : XRVisibilityMaskChangeEvent,
) -> XREye =
  #| (self) => ['none', 'left', 'right'].indexOf(self.eye)

///|
pub extern "js" fn XRVisibilityMaskChangeEvent::get_index(
  self : XRVisibilityMaskChangeEvent,
) -> Int =
  #| (self) => self.index

///|
pub extern "js" fn XRVisibilityMaskChangeEvent::get_vertices(
  self : XRVisibilityMaskChangeEvent,
) -> Float32Array =
  #| (self) => self.vertices

///|
pub extern "js" fn XRVisibilityMaskChangeEvent::get_indices(
  self : XRVisibilityMaskChangeEvent,
) -> Uint32Array =
  #| (self) => self.indices

///|
/// XRPermissionStatus interface
pub type XRPermissionStatus

///|
pub extern "js" fn XRPermissionStatus::to_js_value(
  self : XRPermissionStatus,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRPermissionStatus (unchecked)
pub extern "js" fn XRPermissionStatus::from_js_value(
  v : JsValue,
) -> XRPermissionStatus =
  #| (v) => v

///|
/// Safely cast JsValue to XRPermissionStatus (checked with instanceof)
pub extern "js" fn XRPermissionStatus::from_js_value_opt(
  v : JsValue,
) -> XRPermissionStatus? =
  #| (v) => (v instanceof XRPermissionStatus) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRPermissionStatus (checked with instanceof)
pub extern "js" fn JsValue::as_xr_permission_status(
  self : JsValue,
) -> XRPermissionStatus? =
  #| (self) => (self instanceof XRPermissionStatus) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRPermissionStatus (unchecked)
pub extern "js" fn JsValue::to_xr_permission_status(
  self : JsValue,
) -> XRPermissionStatus =
  #| (self) => self

///|
pub extern "js" fn XRPermissionStatus::to_permission_status(
  self : XRPermissionStatus,
) -> PermissionStatus =
  #| (self) => self

///|
pub extern "js" fn XRPermissionStatus::to_event_target(
  self : XRPermissionStatus,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRPermissionStatus::get_granted(
  self : XRPermissionStatus,
) -> Array[String] =
  #| (self) => self.granted

///|
pub extern "js" fn XRPermissionStatus::set_granted(
  self : XRPermissionStatus,
  value : Array[String],
) -> Unit =
  #| (self, value) => { self.granted = value }