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

///|
/// ColorSelectionResult dictionary
pub(all) struct ColorSelectionResult {
  sRGBHex : String?
}

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

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

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

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

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

///|
/// ColorSelectionOptions dictionary
pub(all) struct ColorSelectionOptions {
  signal : AbortSignal?
}

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

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

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

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

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

///|
/// EyeDropper interface
pub type EyeDropper

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

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

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

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

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

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

///|
pub extern "js" fn EyeDropper::new() -> EyeDropper =
  #| () => new EyeDropper()

///|
pub extern "js" fn EyeDropper::open(
  self : EyeDropper,
) -> Promise[Result[ColorSelectionResult, EyeDropperOpenError]] =
  #| (self) => self.open().then(v => ({
  #|   sRGBHex: v.sRGBHex
  #| })).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'AbortError') return { $tag: 0, _0: e }; if (n === 'OperationError') return { $tag: 1, _0: e }; if (n === 'NotAllowedError') return { $tag: 2, _0: e }; if (n === 'InvalidStateError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }))

///|
extern "js" fn EyeDropper::open_with_options_ffi(
  self : EyeDropper,
  options : JsValue,
) -> Promise[Result[ColorSelectionResult, EyeDropperOpenError]] =
  #| (self, options) => self.open(options).then(v => ({
  #|   sRGBHex: v.sRGBHex
  #| })).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'AbortError') return { $tag: 0, _0: e }; if (n === 'OperationError') return { $tag: 1, _0: e }; if (n === 'NotAllowedError') return { $tag: 2, _0: e }; if (n === 'InvalidStateError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }))

///|
pub fn EyeDropper::open_with_options(
  self : EyeDropper,
  options : ColorSelectionOptions,
) -> Promise[Result[ColorSelectionResult, EyeDropperOpenError]] {
  EyeDropper::open_with_options_ffi(self, options.to_js())
}