// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/css-scroll-snap-2

///|
/// SnapEventInit dictionary
pub(all) struct SnapEventInit {
  snapTargetBlock : Nullable[Node]
  snapTargetInline : Nullable[Node]
}

///|
/// Create a new SnapEventInit with default values
pub fn SnapEventInit::default() -> SnapEventInit {
  SnapEventInit::{
    snapTargetBlock: Nullable::Undefined,
    snapTargetInline: Nullable::Undefined,
  }
}

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

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

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

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

///|
/// SnapEvent interface
pub type SnapEvent

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

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

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

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

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

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

///|
pub extern "js" fn SnapEvent::new(type_ : String) -> SnapEvent =
  #| (type_) => new SnapEvent(type_)

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

///|
pub fn SnapEvent::new_with_event_init_dict(
  type_ : String,
  event_init_dict : SnapEventInit,
) -> SnapEvent {
  SnapEvent::new_with_event_init_dict_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn SnapEvent::get_snap_target_block(self : SnapEvent) -> Node? =
  #| (self) => (() => { const v = self.snapTargetBlock; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn SnapEvent::get_snap_target_inline(self : SnapEvent) -> Node? =
  #| (self) => (() => { const v = self.snapTargetInline; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()