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

///|
/// BlobPart typedef
pub type BlobPart

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

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

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

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

///|
/// Check if this BlobPart is BufferSource
pub extern "js" fn BlobPart::is_buffer_source(self : BlobPart) -> 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 BlobPart is Blob
pub extern "js" fn BlobPart::is_blob(self : BlobPart) -> Bool =
  #| (self) => self instanceof Blob

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

///|
/// Try to get BlobPart as BufferSource
pub extern "js" fn BlobPart::as_buffer_source(self : BlobPart) -> 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 BlobPart as Blob
pub extern "js" fn BlobPart::as_blob(self : BlobPart) -> Blob? =
  #| (self) => (self instanceof Blob) ? { $tag: 1, _0: self } : { $tag: 0 }

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

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

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

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

///|
/// EndingType enum
pub(all) enum EndingType {
  Transparent
  Native
} derive(Eq, Show)

///|
/// Convert to string value
pub fn EndingType::to_string(self : EndingType) -> String {
  match self {
    EndingType::Transparent => "transparent"
    EndingType::Native => "native"
  }
}

///|
/// Parse from string value
pub fn EndingType::from_string(s : String) -> EndingType? {
  match s {
    "transparent" => Some(EndingType::Transparent)
    "native" => Some(EndingType::Native)
    _ => None
  }
}

///|
/// BlobPropertyBag dictionary
pub(all) struct BlobPropertyBag {
  type_ : String?
  endings : EndingType?
}

///|
/// Create a new BlobPropertyBag with default values
pub fn BlobPropertyBag::default() -> BlobPropertyBag {
  BlobPropertyBag::{ type_: None, endings: None }
}

///|
extern "js" fn BlobPropertyBag::to_js_ffi(self : BlobPropertyBag) -> JsValue =
  #| (self) => ({
  #|   type: self.type_,
  #|   endings: ((() => { const v = self.endings; if (v === undefined) return undefined; return ['transparent', 'native'][v]; })())
  #| })

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

///|
extern "js" fn BlobPropertyBag::from_js_ffi(value : JsValue) -> BlobPropertyBag =
  #| (v) => ({
  #|   type_: v.type,
  #|   endings: (v.endings === undefined ? undefined : ['transparent', 'native'].indexOf(v.endings))
  #| })

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

///|
/// FilePropertyBag dictionary
pub(all) struct FilePropertyBag {
  type_ : String?
  endings : EndingType?
  lastModified : Int64?
}

///|
/// Create a new FilePropertyBag with default values
pub fn FilePropertyBag::default() -> FilePropertyBag {
  FilePropertyBag::{ type_: None, endings: None, lastModified: None }
}

///|
extern "js" fn FilePropertyBag::to_js_ffi(self : FilePropertyBag) -> JsValue =
  #| (self) => ({
  #|   type: self.type_,
  #|   endings: ((() => { const v = self.endings; if (v === undefined) return undefined; return ['transparent', 'native'][v]; })()),
  #|   lastModified: self.lastModified
  #| })

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

///|
extern "js" fn FilePropertyBag::from_js_ffi(value : JsValue) -> FilePropertyBag =
  #| (v) => ({
  #|   type_: v.type,
  #|   endings: (v.endings === undefined ? undefined : ['transparent', 'native'].indexOf(v.endings)),
  #|   lastModified: v.lastModified
  #| })

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

///|
/// Blob interface
pub type Blob

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

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

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

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

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

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

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

///|
extern "js" fn Blob::new_with_options_ffi(
  blob_parts : Array[BlobPart],
  options : JsValue,
) -> Blob =
  #| (blob_parts, options) => new Blob(blob_parts, options)

///|
pub fn Blob::new_with_options(
  blob_parts : Array[BlobPart],
  options : BlobPropertyBag,
) -> Blob {
  Blob::new_with_options_ffi(blob_parts, options.to_js())
}

///|
pub extern "js" fn Blob::get_size(self : Blob) -> Int64 =
  #| (self) => (() => { const n = self.size; return { hi: Math.floor(n / 4294967296), lo: n >>> 0 }; })()

///|
pub extern "js" fn Blob::get_type(self : Blob) -> String =
  #| (self) => self.type

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

///|
pub extern "js" fn Blob::slice_with_content_type(
  self : Blob,
  start : Int64,
  end : Int64,
  content_type : String,
) -> Blob =
  #| (self, start, end, content_type) => self.slice((start.hi * 4294967296 + start.lo), (end.hi * 4294967296 + end.lo), content_type)

///|
pub extern "js" fn Blob::stream(self : Blob) -> ReadableStream =
  #| (self) => self.stream()

///|
pub extern "js" fn Blob::text(self : Blob) -> Promise[String] =
  #| (self) => self.text()

///|
pub extern "js" fn Blob::array_buffer(self : Blob) -> Promise[ArrayBuffer] =
  #| (self) => self.arrayBuffer()

///|
pub extern "js" fn Blob::bytes(self : Blob) -> Promise[Uint8Array] =
  #| (self) => self.bytes()

///|
/// File interface
pub type File

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

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

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

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

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

///|
pub extern "js" fn File::to_blob(self : File) -> Blob =
  #| (self) => self

///|
pub extern "js" fn File::new(
  file_bits : Array[BlobPart],
  file_name : String,
) -> File =
  #| (file_bits, file_name) => new File(file_bits, file_name)

///|
extern "js" fn File::new_with_options_ffi(
  file_bits : Array[BlobPart],
  file_name : String,
  options : JsValue,
) -> File =
  #| (file_bits, file_name, options) => new File(file_bits, file_name, options)

///|
pub fn File::new_with_options(
  file_bits : Array[BlobPart],
  file_name : String,
  options : FilePropertyBag,
) -> File {
  File::new_with_options_ffi(file_bits, file_name, options.to_js())
}

///|
pub extern "js" fn File::get_name(self : File) -> String =
  #| (self) => self.name

///|
pub extern "js" fn File::get_last_modified(self : File) -> Int64 =
  #| (self) => (() => { const n = self.lastModified; return { hi: Math.floor(n / 4294967296), lo: n >>> 0 }; })()

///|
pub extern "js" fn File::get_webkit_relative_path(self : File) -> String =
  #| (self) => self.webkitRelativePath

///|
/// FileList interface
pub type FileList

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

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

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

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

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

///|
pub extern "js" fn FileList::item(self : FileList, index : Int) -> File? =
  #| (self, index) => (() => { const v = self.item(index); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
#alias("_[_]")
pub extern "js" fn FileList::get(self : FileList, index : Int) -> File? =
  #| (self, index) => (() => { const v = self[index]; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

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

///|
/// FileReader interface
pub type FileReader

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

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

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

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

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

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

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

///|
pub extern "js" fn FileReader::read_as_array_buffer(
  self : FileReader,
  blob : Blob,
) -> Unit =
  #| (self, blob) => self.readAsArrayBuffer(blob)

///|
/// @alert deprecated "readAsBinaryString is deprecated"
pub extern "js" fn FileReader::read_as_binary_string(
  self : FileReader,
  blob : Blob,
) -> Unit =
  #| (self, blob) => self.readAsBinaryString(blob)

///|
pub extern "js" fn FileReader::read_as_text(
  self : FileReader,
  blob : Blob,
) -> Unit =
  #| (self, blob) => self.readAsText(blob)

///|
pub extern "js" fn FileReader::read_as_text_with_encoding(
  self : FileReader,
  blob : Blob,
  encoding : String,
) -> Unit =
  #| (self, blob, encoding) => self.readAsText(blob, encoding)

///|
pub extern "js" fn FileReader::read_as_data_url(
  self : FileReader,
  blob : Blob,
) -> Unit =
  #| (self, blob) => self.readAsDataURL(blob)

///|
pub extern "js" fn FileReader::abort(self : FileReader) -> Unit =
  #| (self) => self.abort()

// FileReader.EMPTY

///|
pub let file_reader_empty : Int = 0

// FileReader.LOADING

///|
pub let file_reader_loading : Int = 1

// FileReader.DONE

///|
pub let file_reader_done : Int = 2

///|
pub extern "js" fn FileReader::get_ready_state(self : FileReader) -> Int =
  #| (self) => self.readyState

///|
pub extern "js" fn FileReader::get_result(
  self : FileReader,
) -> StringOrArrayBuffer =
  #| (self) => self.result

///|
pub extern "js" fn FileReader::get_error(self : FileReader) -> DOMException? =
  #| (self) => (() => { const v = self.error; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn FileReader::set_onloadstart(
  self : FileReader,
  handler : (ProgressEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onloadstart = (e) => handler(e) }

///|
pub extern "js" fn FileReader::clear_onloadstart(self : FileReader) -> Unit =
  #| (self) => { self.onloadstart = null }

///|
pub extern "js" fn FileReader::set_onprogress(
  self : FileReader,
  handler : (ProgressEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onprogress = (e) => handler(e) }

///|
pub extern "js" fn FileReader::clear_onprogress(self : FileReader) -> Unit =
  #| (self) => { self.onprogress = null }

///|
pub extern "js" fn FileReader::set_onload(
  self : FileReader,
  handler : (ProgressEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onload = (e) => handler(e) }

///|
pub extern "js" fn FileReader::clear_onload(self : FileReader) -> Unit =
  #| (self) => { self.onload = null }

///|
pub extern "js" fn FileReader::set_onabort(
  self : FileReader,
  handler : (ProgressEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onabort = (e) => handler(e) }

///|
pub extern "js" fn FileReader::clear_onabort(self : FileReader) -> Unit =
  #| (self) => { self.onabort = null }

///|
pub extern "js" fn FileReader::set_onerror(
  self : FileReader,
  handler : (ProgressEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onerror = (e) => handler(e) }

///|
pub extern "js" fn FileReader::clear_onerror(self : FileReader) -> Unit =
  #| (self) => { self.onerror = null }

///|
pub extern "js" fn FileReader::set_onloadend(
  self : FileReader,
  handler : (ProgressEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onloadend = (e) => handler(e) }

///|
pub extern "js" fn FileReader::clear_onloadend(self : FileReader) -> Unit =
  #| (self) => { self.onloadend = null }

///|
/// FileReaderSync interface
pub type FileReaderSync

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

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

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

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

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

///|
/// Error type for throwing methods
pub(all) enum FileReaderSyncReadAsArrayBufferError {
  EncodingError(JsError)
  NotFoundError(JsError)
  SecurityError(JsError)
  NotReadableError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum FileReaderSyncReadAsBinaryStringError {
  EncodingError(JsError)
  NotFoundError(JsError)
  SecurityError(JsError)
  NotReadableError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum FileReaderSyncReadAsTextError {
  EncodingError(JsError)
  NotFoundError(JsError)
  SecurityError(JsError)
  NotReadableError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum FileReaderSyncReadAsDataURLError {
  EncodingError(JsError)
  NotFoundError(JsError)
  SecurityError(JsError)
  NotReadableError(JsError)
  OtherError(JsError)
} derive(Show)

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

///|
pub extern "js" fn FileReaderSync::read_as_array_buffer(
  self : FileReaderSync,
  blob : Blob,
) -> Result[ArrayBuffer, FileReaderSyncReadAsArrayBufferError] =
  #| (self, blob) => (() => { try { return { $tag: 1, _0: self.readAsArrayBuffer(blob) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'EncodingError') return { $tag: 0, _0: e }; if (n === 'NotFoundError') return { $tag: 1, _0: e }; if (n === 'SecurityError') return { $tag: 2, _0: e }; if (n === 'NotReadableError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }; } })()

///|
/// @alert deprecated "readAsBinaryString is deprecated"
pub extern "js" fn FileReaderSync::read_as_binary_string(
  self : FileReaderSync,
  blob : Blob,
) -> Result[String, FileReaderSyncReadAsBinaryStringError] =
  #| (self, blob) => (() => { try { return { $tag: 1, _0: self.readAsBinaryString(blob) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'EncodingError') return { $tag: 0, _0: e }; if (n === 'NotFoundError') return { $tag: 1, _0: e }; if (n === 'SecurityError') return { $tag: 2, _0: e }; if (n === 'NotReadableError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }; } })()

///|
pub extern "js" fn FileReaderSync::read_as_text(
  self : FileReaderSync,
  blob : Blob,
) -> Result[String, FileReaderSyncReadAsTextError] =
  #| (self, blob) => (() => { try { return { $tag: 1, _0: self.readAsText(blob) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'EncodingError') return { $tag: 0, _0: e }; if (n === 'NotFoundError') return { $tag: 1, _0: e }; if (n === 'SecurityError') return { $tag: 2, _0: e }; if (n === 'NotReadableError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }; } })()

///|
pub extern "js" fn FileReaderSync::read_as_text_with_encoding(
  self : FileReaderSync,
  blob : Blob,
  encoding : String,
) -> Result[String, FileReaderSyncReadAsTextError] =
  #| (self, blob, encoding) => (() => { try { return { $tag: 1, _0: self.readAsText(blob, encoding) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'EncodingError') return { $tag: 0, _0: e }; if (n === 'NotFoundError') return { $tag: 1, _0: e }; if (n === 'SecurityError') return { $tag: 2, _0: e }; if (n === 'NotReadableError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }; } })()

///|
pub extern "js" fn FileReaderSync::read_as_data_url(
  self : FileReaderSync,
  blob : Blob,
) -> Result[String, FileReaderSyncReadAsDataURLError] =
  #| (self, blob) => (() => { try { return { $tag: 1, _0: self.readAsDataURL(blob) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'EncodingError') return { $tag: 0, _0: e }; if (n === 'NotFoundError') return { $tag: 1, _0: e }; if (n === 'SecurityError') return { $tag: 2, _0: e }; if (n === 'NotReadableError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }; } })()