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

///|
/// HeadersInit typedef
pub type HeadersInit

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

///|
/// Create HeadersInit from Array[Array[String]]
pub extern "js" fn HeadersInit::from_array_of_array_of_string(
  v : Array[Array[String]],
) -> HeadersInit =
  #| (v) => v

///|
/// Check if this HeadersInit is Array[Array[String]]
pub extern "js" fn HeadersInit::is_array_of_array_of_string(
  self : HeadersInit,
) -> Bool =
  #| (self) => Array.isArray(self)

///|
/// Try to get HeadersInit as Array[Array[String]]
pub extern "js" fn HeadersInit::as_array_of_array_of_string(
  self : HeadersInit,
) -> Array[Array[String]]? =
  #| (self) => (Array.isArray(self)) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Flatten Option[HeadersInit] to Array[Array[String]]?
pub fn HeadersInit::bind_as_array_of_array_of_string(
  value : HeadersInit?,
) -> Array[Array[String]]? {
  match value {
    Some(v) => v.as_array_of_array_of_string()
    None => None
  }
}

///|
/// XMLHttpRequestBodyInit typedef
pub type XMLHttpRequestBodyInit

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

///|
/// Create XMLHttpRequestBodyInit from Blob
pub extern "js" fn XMLHttpRequestBodyInit::from_blob(
  v : Blob,
) -> XMLHttpRequestBodyInit =
  #| (v) => v

///|
/// Create XMLHttpRequestBodyInit from BufferSource
pub extern "js" fn XMLHttpRequestBodyInit::from_buffer_source(
  v : BufferSource,
) -> XMLHttpRequestBodyInit =
  #| (v) => v

///|
/// Create XMLHttpRequestBodyInit from FormData
pub extern "js" fn XMLHttpRequestBodyInit::from_form_data(
  v : FormData,
) -> XMLHttpRequestBodyInit =
  #| (v) => v

///|
/// Create XMLHttpRequestBodyInit from URLSearchParams
pub extern "js" fn XMLHttpRequestBodyInit::from_url_search_params(
  v : URLSearchParams,
) -> XMLHttpRequestBodyInit =
  #| (v) => v

///|
/// Create XMLHttpRequestBodyInit from String
pub extern "js" fn XMLHttpRequestBodyInit::from_string(
  v : String,
) -> XMLHttpRequestBodyInit =
  #| (v) => v

///|
/// Check if this XMLHttpRequestBodyInit is Blob
pub extern "js" fn XMLHttpRequestBodyInit::is_blob(
  self : XMLHttpRequestBodyInit,
) -> Bool =
  #| (self) => self instanceof Blob

///|
/// Check if this XMLHttpRequestBodyInit is BufferSource
pub extern "js" fn XMLHttpRequestBodyInit::is_buffer_source(
  self : XMLHttpRequestBodyInit,
) -> Bool =
  #| (self) => self instanceof Int8Array || self instanceof Int16Array || self instanceof Int32Array || self instanceof Uint8Array || self instanceof Uint16Array || self instanceof Uint32Array || self instanceof Uint8ClampedArray || self instanceof BigInt64Array || self instanceof BigUint64Array || self instanceof Float16Array || self instanceof Float32Array || self instanceof Float64Array || self instanceof DataView || self instanceof ArrayBuffer

///|
/// Check if this XMLHttpRequestBodyInit is FormData
pub extern "js" fn XMLHttpRequestBodyInit::is_form_data(
  self : XMLHttpRequestBodyInit,
) -> Bool =
  #| (self) => self instanceof FormData

///|
/// Check if this XMLHttpRequestBodyInit is URLSearchParams
pub extern "js" fn XMLHttpRequestBodyInit::is_url_search_params(
  self : XMLHttpRequestBodyInit,
) -> Bool =
  #| (self) => self instanceof URLSearchParams

///|
/// Check if this XMLHttpRequestBodyInit is String
pub extern "js" fn XMLHttpRequestBodyInit::is_string(
  self : XMLHttpRequestBodyInit,
) -> Bool =
  #| (self) => typeof self === 'string'

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

///|
/// Try to get XMLHttpRequestBodyInit as BufferSource
pub extern "js" fn XMLHttpRequestBodyInit::as_buffer_source(
  self : XMLHttpRequestBodyInit,
) -> BufferSource? =
  #| (self) => (self instanceof Int8Array || self instanceof Int16Array || self instanceof Int32Array || self instanceof Uint8Array || self instanceof Uint16Array || self instanceof Uint32Array || self instanceof Uint8ClampedArray || self instanceof BigInt64Array || self instanceof BigUint64Array || self instanceof Float16Array || self instanceof Float32Array || self instanceof Float64Array || self instanceof DataView || self instanceof ArrayBuffer) ? { $tag: 1, _0: self } : { $tag: 0 }

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

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

///|
/// Try to get XMLHttpRequestBodyInit as String
pub extern "js" fn XMLHttpRequestBodyInit::as_string(
  self : XMLHttpRequestBodyInit,
) -> String? =
  #| (self) => (typeof self === 'string') ? self : undefined

///|
/// Flatten Option[XMLHttpRequestBodyInit] to Blob?
pub fn XMLHttpRequestBodyInit::bind_as_blob(
  value : XMLHttpRequestBodyInit?,
) -> Blob? {
  match value {
    Some(v) => v.as_blob()
    None => None
  }
}

///|
/// Flatten Option[XMLHttpRequestBodyInit] to BufferSource?
pub fn XMLHttpRequestBodyInit::bind_as_buffer_source(
  value : XMLHttpRequestBodyInit?,
) -> BufferSource? {
  match value {
    Some(v) => v.as_buffer_source()
    None => None
  }
}

///|
/// Flatten Option[XMLHttpRequestBodyInit] to FormData?
pub fn XMLHttpRequestBodyInit::bind_as_form_data(
  value : XMLHttpRequestBodyInit?,
) -> FormData? {
  match value {
    Some(v) => v.as_form_data()
    None => None
  }
}

///|
/// Flatten Option[XMLHttpRequestBodyInit] to URLSearchParams?
pub fn XMLHttpRequestBodyInit::bind_as_url_search_params(
  value : XMLHttpRequestBodyInit?,
) -> URLSearchParams? {
  match value {
    Some(v) => v.as_url_search_params()
    None => None
  }
}

///|
/// Flatten Option[XMLHttpRequestBodyInit] to String?
pub fn XMLHttpRequestBodyInit::bind_as_string(
  value : XMLHttpRequestBodyInit?,
) -> String? {
  match value {
    Some(v) => v.as_string()
    None => None
  }
}

///|
/// BodyInit typedef
pub type BodyInit

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

///|
/// Create BodyInit from ReadableStream
pub extern "js" fn BodyInit::from_readable_stream(
  v : ReadableStream,
) -> BodyInit =
  #| (v) => v

///|
/// Create BodyInit from XMLHttpRequestBodyInit
pub extern "js" fn BodyInit::from_xml_http_request_body_init(
  v : XMLHttpRequestBodyInit,
) -> BodyInit =
  #| (v) => v

///|
/// Check if this BodyInit is ReadableStream
pub extern "js" fn BodyInit::is_readable_stream(self : BodyInit) -> Bool =
  #| (self) => self instanceof ReadableStream

///|
/// Check if this BodyInit is XMLHttpRequestBodyInit
pub extern "js" fn BodyInit::is_xml_http_request_body_init(
  self : BodyInit,
) -> Bool =
  #| (self) => self instanceof Blob || self instanceof Int8Array || self instanceof Int16Array || self instanceof Int32Array || self instanceof Uint8Array || self instanceof Uint16Array || self instanceof Uint32Array || self instanceof Uint8ClampedArray || self instanceof BigInt64Array || self instanceof BigUint64Array || self instanceof Float16Array || self instanceof Float32Array || self instanceof Float64Array || self instanceof DataView || self instanceof ArrayBuffer || self instanceof FormData || self instanceof URLSearchParams || typeof self === 'string'

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

///|
/// Try to get BodyInit as XMLHttpRequestBodyInit
pub extern "js" fn BodyInit::as_xml_http_request_body_init(
  self : BodyInit,
) -> XMLHttpRequestBodyInit? =
  #| (self) => (self instanceof Blob || self instanceof Int8Array || self instanceof Int16Array || self instanceof Int32Array || self instanceof Uint8Array || self instanceof Uint16Array || self instanceof Uint32Array || self instanceof Uint8ClampedArray || self instanceof BigInt64Array || self instanceof BigUint64Array || self instanceof Float16Array || self instanceof Float32Array || self instanceof Float64Array || self instanceof DataView || self instanceof ArrayBuffer || self instanceof FormData || self instanceof URLSearchParams || typeof self === 'string') ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Flatten Option[BodyInit] to ReadableStream?
pub fn BodyInit::bind_as_readable_stream(value : BodyInit?) -> ReadableStream? {
  match value {
    Some(v) => v.as_readable_stream()
    None => None
  }
}

///|
/// Flatten Option[BodyInit] to XMLHttpRequestBodyInit?
pub fn BodyInit::bind_as_xml_http_request_body_init(
  value : BodyInit?,
) -> XMLHttpRequestBodyInit? {
  match value {
    Some(v) => v.as_xml_http_request_body_init()
    None => None
  }
}

///|
/// RequestInfo typedef
pub type RequestInfo

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

///|
/// Create RequestInfo from Request
pub extern "js" fn RequestInfo::from_request(v : Request) -> RequestInfo =
  #| (v) => v

///|
/// Create RequestInfo from String
pub extern "js" fn RequestInfo::from_string(v : String) -> RequestInfo =
  #| (v) => v

///|
/// Check if this RequestInfo is Request
pub extern "js" fn RequestInfo::is_request(self : RequestInfo) -> Bool =
  #| (self) => self instanceof Request

///|
/// Check if this RequestInfo is String
pub extern "js" fn RequestInfo::is_string(self : RequestInfo) -> Bool =
  #| (self) => typeof self === 'string'

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

///|
/// Try to get RequestInfo as String
pub extern "js" fn RequestInfo::as_string(self : RequestInfo) -> String? =
  #| (self) => (typeof self === 'string') ? self : undefined

///|
/// Flatten Option[RequestInfo] to Request?
pub fn RequestInfo::bind_as_request(value : RequestInfo?) -> Request? {
  match value {
    Some(v) => v.as_request()
    None => None
  }
}

///|
/// Flatten Option[RequestInfo] to String?
pub fn RequestInfo::bind_as_string(value : RequestInfo?) -> String? {
  match value {
    Some(v) => v.as_string()
    None => None
  }
}

///|
/// RequestDestination enum
pub(all) enum RequestDestination {
  Empty
  Audio
  Audioworklet
  Document
  Embed
  Font
  Frame
  Iframe
  Image
  Json
  Manifest
  Object
  Paintworklet
  Report
  Script
  Sharedworker
  Style
  Track
  Video
  Worker
  Xslt
} derive(Eq, Show)

///|
/// Convert to string value
pub fn RequestDestination::to_string(self : RequestDestination) -> String {
  match self {
    RequestDestination::Empty => ""
    RequestDestination::Audio => "audio"
    RequestDestination::Audioworklet => "audioworklet"
    RequestDestination::Document => "document"
    RequestDestination::Embed => "embed"
    RequestDestination::Font => "font"
    RequestDestination::Frame => "frame"
    RequestDestination::Iframe => "iframe"
    RequestDestination::Image => "image"
    RequestDestination::Json => "json"
    RequestDestination::Manifest => "manifest"
    RequestDestination::Object => "object"
    RequestDestination::Paintworklet => "paintworklet"
    RequestDestination::Report => "report"
    RequestDestination::Script => "script"
    RequestDestination::Sharedworker => "sharedworker"
    RequestDestination::Style => "style"
    RequestDestination::Track => "track"
    RequestDestination::Video => "video"
    RequestDestination::Worker => "worker"
    RequestDestination::Xslt => "xslt"
  }
}

///|
/// Parse from string value
pub fn RequestDestination::from_string(s : String) -> RequestDestination? {
  match s {
    "" => Some(RequestDestination::Empty)
    "audio" => Some(RequestDestination::Audio)
    "audioworklet" => Some(RequestDestination::Audioworklet)
    "document" => Some(RequestDestination::Document)
    "embed" => Some(RequestDestination::Embed)
    "font" => Some(RequestDestination::Font)
    "frame" => Some(RequestDestination::Frame)
    "iframe" => Some(RequestDestination::Iframe)
    "image" => Some(RequestDestination::Image)
    "json" => Some(RequestDestination::Json)
    "manifest" => Some(RequestDestination::Manifest)
    "object" => Some(RequestDestination::Object)
    "paintworklet" => Some(RequestDestination::Paintworklet)
    "report" => Some(RequestDestination::Report)
    "script" => Some(RequestDestination::Script)
    "sharedworker" => Some(RequestDestination::Sharedworker)
    "style" => Some(RequestDestination::Style)
    "track" => Some(RequestDestination::Track)
    "video" => Some(RequestDestination::Video)
    "worker" => Some(RequestDestination::Worker)
    "xslt" => Some(RequestDestination::Xslt)
    _ => None
  }
}

///|
/// RequestMode enum
pub(all) enum RequestMode {
  Navigate
  SameOrigin
  NoCors
  Cors
} derive(Eq, Show)

///|
/// Convert to string value
pub fn RequestMode::to_string(self : RequestMode) -> String {
  match self {
    RequestMode::Navigate => "navigate"
    RequestMode::SameOrigin => "same-origin"
    RequestMode::NoCors => "no-cors"
    RequestMode::Cors => "cors"
  }
}

///|
/// Parse from string value
pub fn RequestMode::from_string(s : String) -> RequestMode? {
  match s {
    "navigate" => Some(RequestMode::Navigate)
    "same-origin" => Some(RequestMode::SameOrigin)
    "no-cors" => Some(RequestMode::NoCors)
    "cors" => Some(RequestMode::Cors)
    _ => None
  }
}

///|
/// RequestCredentials enum
pub(all) enum RequestCredentials {
  Omit
  SameOrigin
  Include
} derive(Eq, Show)

///|
/// Convert to string value
pub fn RequestCredentials::to_string(self : RequestCredentials) -> String {
  match self {
    RequestCredentials::Omit => "omit"
    RequestCredentials::SameOrigin => "same-origin"
    RequestCredentials::Include => "include"
  }
}

///|
/// Parse from string value
pub fn RequestCredentials::from_string(s : String) -> RequestCredentials? {
  match s {
    "omit" => Some(RequestCredentials::Omit)
    "same-origin" => Some(RequestCredentials::SameOrigin)
    "include" => Some(RequestCredentials::Include)
    _ => None
  }
}

///|
/// RequestCache enum
pub(all) enum RequestCache {
  Default
  NoStore
  Reload
  NoCache
  ForceCache
  OnlyIfCached
} derive(Eq, Show)

///|
/// Convert to string value
pub fn RequestCache::to_string(self : RequestCache) -> String {
  match self {
    RequestCache::Default => "default"
    RequestCache::NoStore => "no-store"
    RequestCache::Reload => "reload"
    RequestCache::NoCache => "no-cache"
    RequestCache::ForceCache => "force-cache"
    RequestCache::OnlyIfCached => "only-if-cached"
  }
}

///|
/// Parse from string value
pub fn RequestCache::from_string(s : String) -> RequestCache? {
  match s {
    "default" => Some(RequestCache::Default)
    "no-store" => Some(RequestCache::NoStore)
    "reload" => Some(RequestCache::Reload)
    "no-cache" => Some(RequestCache::NoCache)
    "force-cache" => Some(RequestCache::ForceCache)
    "only-if-cached" => Some(RequestCache::OnlyIfCached)
    _ => None
  }
}

///|
/// RequestRedirect enum
pub(all) enum RequestRedirect {
  Follow
  Error
  Manual
} derive(Eq, Show)

///|
/// Convert to string value
pub fn RequestRedirect::to_string(self : RequestRedirect) -> String {
  match self {
    RequestRedirect::Follow => "follow"
    RequestRedirect::Error => "error"
    RequestRedirect::Manual => "manual"
  }
}

///|
/// Parse from string value
pub fn RequestRedirect::from_string(s : String) -> RequestRedirect? {
  match s {
    "follow" => Some(RequestRedirect::Follow)
    "error" => Some(RequestRedirect::Error)
    "manual" => Some(RequestRedirect::Manual)
    _ => None
  }
}

///|
/// RequestDuplex enum
pub(all) enum RequestDuplex {
  Half
} derive(Eq, Show)

///|
/// Convert to string value
pub fn RequestDuplex::to_string(self : RequestDuplex) -> String {
  match self {
    RequestDuplex::Half => "half"
  }
}

///|
/// Parse from string value
pub fn RequestDuplex::from_string(s : String) -> RequestDuplex? {
  match s {
    "half" => Some(RequestDuplex::Half)
    _ => None
  }
}

///|
/// RequestPriority enum
pub(all) enum RequestPriority {
  High
  Low
  Auto
} derive(Eq, Show)

///|
/// Convert to string value
pub fn RequestPriority::to_string(self : RequestPriority) -> String {
  match self {
    RequestPriority::High => "high"
    RequestPriority::Low => "low"
    RequestPriority::Auto => "auto"
  }
}

///|
/// Parse from string value
pub fn RequestPriority::from_string(s : String) -> RequestPriority? {
  match s {
    "high" => Some(RequestPriority::High)
    "low" => Some(RequestPriority::Low)
    "auto" => Some(RequestPriority::Auto)
    _ => None
  }
}

///|
/// ResponseType enum
pub(all) enum ResponseType {
  Basic
  Cors
  Default
  Error
  Opaque
  Opaqueredirect
} derive(Eq, Show)

///|
/// Convert to string value
pub fn ResponseType::to_string(self : ResponseType) -> String {
  match self {
    ResponseType::Basic => "basic"
    ResponseType::Cors => "cors"
    ResponseType::Default => "default"
    ResponseType::Error => "error"
    ResponseType::Opaque => "opaque"
    ResponseType::Opaqueredirect => "opaqueredirect"
  }
}

///|
/// Parse from string value
pub fn ResponseType::from_string(s : String) -> ResponseType? {
  match s {
    "basic" => Some(ResponseType::Basic)
    "cors" => Some(ResponseType::Cors)
    "default" => Some(ResponseType::Default)
    "error" => Some(ResponseType::Error)
    "opaque" => Some(ResponseType::Opaque)
    "opaqueredirect" => Some(ResponseType::Opaqueredirect)
    _ => None
  }
}

///|
/// ResponseInit dictionary
pub(all) struct ResponseInit {
  status : Int?
  statusText : String?
  headers : HeadersInit?
}

///|
/// Create a new ResponseInit with default values
pub fn ResponseInit::default() -> ResponseInit {
  ResponseInit::{ status: None, statusText: None, headers: None }
}

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

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

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

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

///|
/// DeferredRequestInit dictionary
pub(all) struct DeferredRequestInit {
  activateAfter : DOMHighResTimeStamp?
}

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

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

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

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

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

///|
/// Headers interface
pub type Headers

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

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

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

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

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

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

///|
pub extern "js" fn Headers::new_with_init(init_ : HeadersInit) -> Headers =
  #| (init_) => new Headers(init_)

///|
pub extern "js" fn Headers::append(
  self : Headers,
  name : String,
  value : String,
) -> Unit =
  #| (self, name, value) => self.append(name, value)

///|
pub extern "js" fn Headers::delete(self : Headers, name : String) -> Unit =
  #| (self, name) => self.delete(name)

///|
pub extern "js" fn Headers::get(self : Headers, name : String) -> String? =
  #| (self, name) => (self.get(name)) ?? undefined

///|
pub extern "js" fn Headers::get_set_cookie(self : Headers) -> Array[String] =
  #| (self) => self.getSetCookie()

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

///|
pub extern "js" fn Headers::set(
  self : Headers,
  name : String,
  value : String,
) -> Unit =
  #| (self, name, value) => self.set(name, value)

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

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

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

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

///|
pub extern "js" fn Headers::new_with_array_of_array_of_string(
  init_ : Array[Array[String]],
) -> Headers =
  #| (init_) => new Headers(init_)

///|
/// Request interface
pub type Request

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

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

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

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

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

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

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

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

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

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

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

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

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

///|
extern "js" fn Request::new_with_init_ffi(
  input : RequestInfo,
  init_ : JsValue,
) -> Result[Request, RequestConstructorError] =
  #| (input, init_) => (() => { try { return { $tag: 1, _0: new Request(input, init_) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'NotAllowedError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub fn Request::new_with_init(
  input : RequestInfo,
  init_ : RequestInit,
) -> Result[Request, RequestConstructorError] {
  Request::new_with_init_ffi(input, init_.to_js())
}

///|
pub extern "js" fn Request::get_method(self : Request) -> String =
  #| (self) => self.method

///|
pub extern "js" fn Request::get_url(self : Request) -> String =
  #| (self) => self.url

///|
pub extern "js" fn Request::get_headers(self : Request) -> Headers =
  #| (self) => self.headers

///|
pub extern "js" fn Request::get_destination(
  self : Request,
) -> RequestDestination =
  #| (self) => ['', 'audio', 'audioworklet', 'document', 'embed', 'font', 'frame', 'iframe', 'image', 'json', 'manifest', 'object', 'paintworklet', 'report', 'script', 'sharedworker', 'style', 'track', 'video', 'worker', 'xslt'].indexOf(self.destination)

///|
pub extern "js" fn Request::get_referrer(self : Request) -> String =
  #| (self) => self.referrer

///|
pub extern "js" fn Request::get_referrer_policy(
  self : Request,
) -> ReferrerPolicy =
  #| (self) => ['', 'no-referrer', 'no-referrer-when-downgrade', 'same-origin', 'origin', 'strict-origin', 'origin-when-cross-origin', 'strict-origin-when-cross-origin', 'unsafe-url'].indexOf(self.referrerPolicy)

///|
pub extern "js" fn Request::get_mode(self : Request) -> RequestMode =
  #| (self) => ['navigate', 'same-origin', 'no-cors', 'cors'].indexOf(self.mode)

///|
pub extern "js" fn Request::get_credentials(
  self : Request,
) -> RequestCredentials =
  #| (self) => ['omit', 'same-origin', 'include'].indexOf(self.credentials)

///|
pub extern "js" fn Request::get_cache(self : Request) -> RequestCache =
  #| (self) => ['default', 'no-store', 'reload', 'no-cache', 'force-cache', 'only-if-cached'].indexOf(self.cache)

///|
pub extern "js" fn Request::get_redirect(self : Request) -> RequestRedirect =
  #| (self) => ['follow', 'error', 'manual'].indexOf(self.redirect)

///|
pub extern "js" fn Request::get_integrity(self : Request) -> String =
  #| (self) => self.integrity

///|
pub extern "js" fn Request::get_keepalive(self : Request) -> Bool =
  #| (self) => self.keepalive

///|
pub extern "js" fn Request::get_is_reload_navigation(self : Request) -> Bool =
  #| (self) => self.isReloadNavigation

///|
pub extern "js" fn Request::get_is_history_navigation(self : Request) -> Bool =
  #| (self) => self.isHistoryNavigation

///|
pub extern "js" fn Request::get_signal(self : Request) -> AbortSignal =
  #| (self) => self.signal

///|
pub extern "js" fn Request::get_duplex(self : Request) -> RequestDuplex =
  #| (self) => ['half'].indexOf(self.duplex)

///|
pub extern "js" fn Request::clone(self : Request) -> Request =
  #| (self) => self.clone()

///|
pub extern "js" fn Request::get_target_address_space(
  self : Request,
) -> IPAddressSpace =
  #| (self) => ['public', 'local', 'loopback'].indexOf(self.targetAddressSpace)

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

///|
pub extern "js" fn Request::get_body_used(self : Request) -> Bool =
  #| (self) => self.bodyUsed

///|
pub extern "js" fn Request::array_buffer(
  self : Request,
) -> Promise[Result[ArrayBuffer, RequestArrayBufferError]] =
  #| (self) => self.arrayBuffer().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'RangeError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }))

///|
pub extern "js" fn Request::blob(
  self : Request,
) -> Promise[Result[Blob, RequestBlobError]] =
  #| (self) => self.blob().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $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 Request::bytes(
  self : Request,
) -> Promise[Result[Uint8Array, RequestBytesError]] =
  #| (self) => self.bytes().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'RangeError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }))

///|
pub extern "js" fn Request::form_data(
  self : Request,
) -> Promise[Result[FormData, RequestFormDataError]] =
  #| (self) => self.formData().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $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 Request::json(
  self : Request,
) -> Promise[Result[JsValue, RequestJsonError]] =
  #| (self) => self.json().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'SyntaxError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }))

///|
pub extern "js" fn Request::text(
  self : Request,
) -> Promise[Result[String, RequestTextError]] =
  #| (self) => self.text().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $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 Request::new_with_request(
  input : Request,
  init_ : RequestInit,
) -> Result[Request, RequestConstructorError] =
  #| (input, init_) => (() => { try { return { $tag: 1, _0: new Request(input, init_) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'NotAllowedError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub extern "js" fn Request::new_with_string(
  input : String,
  init_ : RequestInit,
) -> Result[Request, RequestConstructorError] =
  #| (input, init_) => (() => { try { return { $tag: 1, _0: new Request(input, init_) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'NotAllowedError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
/// Response interface
pub type Response

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

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

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

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

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

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

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

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

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

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

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

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

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

///|
extern "js" fn Response::new_with_init_ffi(
  body : BodyInit?,
  init_ : JsValue,
) -> Response =
  #| (body, init_) => new Response((body.$tag === 1 ? body._0 : null), init_)

///|
pub fn Response::new_with_init(
  body : BodyInit?,
  init_ : ResponseInit,
) -> Response {
  Response::new_with_init_ffi(body, init_.to_js())
}

///|
pub extern "js" fn Response::error() -> Response =
  #| () => Response.error()

///|
pub extern "js" fn Response::redirect(
  url : String,
) -> Result[Response, ResponseRedirectError] =
  #| (url) => (() => { try { return { $tag: 1, _0: Response.redirect(url) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'RangeError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub extern "js" fn Response::redirect_with_status(
  url : String,
  status : Int,
) -> Result[Response, ResponseRedirectError] =
  #| (url, status) => (() => { try { return { $tag: 1, _0: Response.redirect(url, status) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'RangeError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub extern "js" fn Response::json(
  data : JsValue,
) -> Result[Response, ResponseJsonError] =
  #| (data) => (() => { try { return { $tag: 1, _0: Response.json(data) }; } 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 Response::json_with_init_ffi(
  data : JsValue,
  init_ : JsValue,
) -> Result[Response, ResponseJsonError] =
  #| (data, init_) => (() => { try { return { $tag: 1, _0: Response.json(data, init_) }; } 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 Response::json_with_init(
  data : JsValue,
  init_ : ResponseInit,
) -> Result[Response, ResponseJsonError] {
  Response::json_with_init_ffi(data, init_.to_js())
}

///|
pub extern "js" fn Response::get_type(self : Response) -> ResponseType =
  #| (self) => ['basic', 'cors', 'default', 'error', 'opaque', 'opaqueredirect'].indexOf(self.type)

///|
pub extern "js" fn Response::get_url(self : Response) -> String =
  #| (self) => self.url

///|
pub extern "js" fn Response::get_redirected(self : Response) -> Bool =
  #| (self) => self.redirected

///|
pub extern "js" fn Response::get_status(self : Response) -> Int =
  #| (self) => self.status

///|
pub extern "js" fn Response::get_ok(self : Response) -> Bool =
  #| (self) => self.ok

///|
pub extern "js" fn Response::get_status_text(self : Response) -> String =
  #| (self) => self.statusText

///|
pub extern "js" fn Response::get_headers(self : Response) -> Headers =
  #| (self) => self.headers

///|
pub extern "js" fn Response::clone(self : Response) -> Response =
  #| (self) => self.clone()

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

///|
pub extern "js" fn Response::get_body_used(self : Response) -> Bool =
  #| (self) => self.bodyUsed

///|
pub extern "js" fn Response::array_buffer(
  self : Response,
) -> Promise[Result[ArrayBuffer, ResponseArrayBufferError]] =
  #| (self) => self.arrayBuffer().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'RangeError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }))

///|
pub extern "js" fn Response::blob(
  self : Response,
) -> Promise[Result[Blob, ResponseBlobError]] =
  #| (self) => self.blob().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $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 Response::bytes(
  self : Response,
) -> Promise[Result[Uint8Array, ResponseBytesError]] =
  #| (self) => self.bytes().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'RangeError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }))

///|
pub extern "js" fn Response::form_data(
  self : Response,
) -> Promise[Result[FormData, ResponseFormDataError]] =
  #| (self) => self.formData().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $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 Response::text(
  self : Response,
) -> Promise[Result[String, ResponseTextError]] =
  #| (self) => self.text().then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }))

///|
/// FetchLaterResult interface
pub type FetchLaterResult

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

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

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

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

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

///|
pub extern "js" fn FetchLaterResult::get_activated(
  self : FetchLaterResult,
) -> Bool =
  #| (self) => self.activated