// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/css-highlight-api

///|
/// HighlightType enum
pub(all) enum HighlightType {
  Highlight
  SpellingError
  GrammarError
} derive(Eq, Show)

///|
/// Convert to string value
pub fn HighlightType::to_string(self : HighlightType) -> String {
  match self {
    HighlightType::Highlight => "highlight"
    HighlightType::SpellingError => "spelling-error"
    HighlightType::GrammarError => "grammar-error"
  }
}

///|
/// Parse from string value
pub fn HighlightType::from_string(s : String) -> HighlightType? {
  match s {
    "highlight" => Some(HighlightType::Highlight)
    "spelling-error" => Some(HighlightType::SpellingError)
    "grammar-error" => Some(HighlightType::GrammarError)
    _ => None
  }
}

///|
/// HighlightHitResult dictionary
pub(all) struct HighlightHitResult {
  highlight : Highlight?
  ranges : Array[AbstractRange]?
}

///|
/// Create a new HighlightHitResult with default values
pub fn HighlightHitResult::default() -> HighlightHitResult {
  HighlightHitResult::{ highlight: None, ranges: None }
}

///|
extern "js" fn HighlightHitResult::to_js_ffi(
  self : HighlightHitResult,
) -> JsValue =
  #| (self) => ({
  #|   highlight: ((() => { const v = self.highlight; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   ranges: ((() => { const v = self.ranges; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn HighlightHitResult::from_js_ffi(
  value : JsValue,
) -> HighlightHitResult =
  #| (v) => ({
  #|   highlight: (v.highlight === undefined ? { $tag: 0 } : { $tag: 1, _0: v.highlight }),
  #|   ranges: (v.ranges === undefined ? { $tag: 0 } : { $tag: 1, _0: v.ranges })
  #| })

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

///|
/// HighlightsFromPointOptions dictionary
pub(all) struct HighlightsFromPointOptions {
  shadowRoots : Array[ShadowRoot]?
}

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

///|
extern "js" fn HighlightsFromPointOptions::to_js_ffi(
  self : HighlightsFromPointOptions,
) -> JsValue =
  #| (self) => ({
  #|   shadowRoots: ((() => { const v = self.shadowRoots; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

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

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

///|
/// Highlight interface
pub type Highlight

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

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

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

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

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

///|
pub extern "js" fn Highlight::new(initial_ranges : AbstractRange) -> Highlight =
  #| (initial_ranges) => new Highlight(initial_ranges)

///|
pub extern "js" fn Highlight::has(
  self : Highlight,
  value : AbstractRange,
) -> Bool =
  #| (self, value) => self.has(value)

///|
pub extern "js" fn Highlight::add(
  self : Highlight,
  value : AbstractRange,
) -> Unit =
  #| (self, value) => { self.add(value) }

///|
pub extern "js" fn Highlight::delete(
  self : Highlight,
  value : AbstractRange,
) -> Bool =
  #| (self, value) => self.delete(value)

///|
pub extern "js" fn Highlight::clear(self : Highlight) -> Unit =
  #| (self) => { self.clear() }

///|
pub extern "js" fn Highlight::get_priority(self : Highlight) -> Int =
  #| (self) => self.priority

///|
pub extern "js" fn Highlight::set_priority(
  self : Highlight,
  value : Int,
) -> Unit =
  #| (self, value) => { self.priority = value }

///|
pub extern "js" fn Highlight::get_type(self : Highlight) -> HighlightType =
  #| (self) => ['highlight', 'spelling-error', 'grammar-error'].indexOf(self.type)

///|
pub extern "js" fn Highlight::set_type(
  self : Highlight,
  value : HighlightType,
) -> Unit =
  #| (self, value) => { self.type = ['highlight', 'spelling-error', 'grammar-error'][value] }

///|
/// HighlightRegistry interface
pub type HighlightRegistry

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

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

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

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

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

///|
pub extern "js" fn HighlightRegistry::get(
  self : HighlightRegistry,
  key : String,
) -> Highlight? =
  #| (self, key) => self.get(key)

///|
pub extern "js" fn HighlightRegistry::has(
  self : HighlightRegistry,
  key : String,
) -> Bool =
  #| (self, key) => self.has(key)

///|
pub extern "js" fn HighlightRegistry::set(
  self : HighlightRegistry,
  key : String,
  value : Highlight,
) -> Unit =
  #| (self, key, value) => { self.set(key, value) }

///|
pub extern "js" fn HighlightRegistry::delete(
  self : HighlightRegistry,
  key : String,
) -> Bool =
  #| (self, key) => self.delete(key)

///|
pub extern "js" fn HighlightRegistry::clear(self : HighlightRegistry) -> Unit =
  #| (self) => { self.clear() }

///|
pub extern "js" fn HighlightRegistry::highlights_from_point(
  self : HighlightRegistry,
  x : Double,
  y : Double,
) -> Array[HighlightHitResult] =
  #| (self, x, y) => self.highlightsFromPoint(x, y)

///|
extern "js" fn HighlightRegistry::highlights_from_point_with_options_ffi(
  self : HighlightRegistry,
  x : Double,
  y : Double,
  options : JsValue,
) -> Array[HighlightHitResult] =
  #| (self, x, y, options) => self.highlightsFromPoint(x, y, options)

///|
pub fn HighlightRegistry::highlights_from_point_with_options(
  self : HighlightRegistry,
  x : Double,
  y : Double,
  options : HighlightsFromPointOptions,
) -> Array[HighlightHitResult] {
  HighlightRegistry::highlights_from_point_with_options_ffi(
    self,
    x,
    y,
    options.to_js(),
  )
}