// Do not edit. This file is generated.
// MoonBit type: Response
// Specifications: fetch.idl

///|
/// [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response)
#external
pub type Response

///|
pub impl TJsValue for Response with to_js(self : Response) -> JsValue = "%identity"

///|
pub impl FromJsAny for Response with from_js_any(value : JsAny) -> Response = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// Prefer `try_into()` for checked downcasts.
#deprecated("Use unsafe_into or try_into instead")
pub fn[T : TResponse] Response::into(self : Response) -> T = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// WARNING: If the underlying JS value is not of type T, this will silently
/// produce a value with incorrect type, leading to undefined behavior.
pub fn[T : TResponse] Response::unsafe_into(self : Response) -> T = "%identity"

///|
pub impl HasConstructor for Response with constructor_name() {
  "Response"
}

///|
/// Checked downcast — returns None if the JS value is not an instance of T.
pub fn[T : TResponse + HasConstructor] Response::try_into(
  self : Response,
) -> T? {
  if js_instanceof(TJsValue::to_js(self), T::constructor_name()) {
    Some(self.unsafe_into())
  } else {
    None
  }
}

///|
pub impl TResponse for Response

///|
pub fn Response::new(body? : &TBodyInit, init? : ResponseInit) -> Response {
  response_new_ffi(
    match body {
      Some(v) => v.to_js()
      None => JsValue::undefined()
    },
    opt_to_js(init),
  )
}

///|
/// [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) interface.
pub trait TResponse: TJsValue {
  type_(self : Self) -> ResponseType = _
  url(self : Self) -> String = _
  redirected(self : Self) -> Bool = _
  status(self : Self) -> UInt = _
  ok(self : Self) -> Bool = _
  status_text(self : Self) -> String = _
  headers(self : Self) -> Headers = _
  clone(self : Self) -> Response = _
  body(self : Self) -> ReadableStream = _
  body_used(self : Self) -> Bool = _
  array_buffer(self : Self) -> JsPromise[ArrayBuffer] = _
  blob(self : Self) -> JsPromise[Blob] = _
  bytes(self : Self) -> JsPromise[Uint8Array] = _
  form_data(self : Self) -> JsPromise[FormData] = _
  json_body(self : Self) -> JsPromise[JsValue] = _
  text(self : Self) -> JsPromise[String] = _
}

///|
/// [Response.error](https://developer.mozilla.org/en-US/docs/Web/API/Response/error)
pub fn Response::error() -> Response {
  response_error_ffi()
}

///|
/// [Response.redirect](https://developer.mozilla.org/en-US/docs/Web/API/Response/redirect)
pub fn Response::redirect(url : String, status? : UInt) -> Response {
  response_redirect_ffi(TJsValue::to_js(url), opt_to_js(status))
}

///|
/// [Response.json](https://developer.mozilla.org/en-US/docs/Web/API/Response/json)
pub fn Response::json(data : JsValue, init? : ResponseInit) -> Response {
  response_json_ffi(TJsValue::to_js(data), opt_to_js(init))
}

///|
/// [Response.type](https://developer.mozilla.org/en-US/docs/Web/API/Response/type)
impl TResponse with type_(self : Self) -> ResponseType {
  response_type_ffi(TJsValue::to_js(self))
}

///|
/// [Response.url](https://developer.mozilla.org/en-US/docs/Web/API/Response/url)
impl TResponse with url(self : Self) -> String {
  response_url_ffi(TJsValue::to_js(self))
}

///|
/// [Response.redirected](https://developer.mozilla.org/en-US/docs/Web/API/Response/redirected)
impl TResponse with redirected(self : Self) -> Bool {
  response_redirected_ffi(TJsValue::to_js(self))
}

///|
/// [Response.status](https://developer.mozilla.org/en-US/docs/Web/API/Response/status)
impl TResponse with status(self : Self) -> UInt {
  response_status_ffi(TJsValue::to_js(self))
}

///|
/// [Response.ok](https://developer.mozilla.org/en-US/docs/Web/API/Response/ok)
impl TResponse with ok(self : Self) -> Bool {
  response_ok_ffi(TJsValue::to_js(self))
}

///|
/// [Response.statusText](https://developer.mozilla.org/en-US/docs/Web/API/Response/statusText)
impl TResponse with status_text(self : Self) -> String {
  response_status_text_ffi(TJsValue::to_js(self))
}

///|
/// [Response.headers](https://developer.mozilla.org/en-US/docs/Web/API/Response/headers)
impl TResponse with headers(self : Self) -> Headers {
  response_headers_ffi(TJsValue::to_js(self))
}

///|
/// [Response.clone](https://developer.mozilla.org/en-US/docs/Web/API/Response/clone)
impl TResponse with clone(self : Self) -> Response {
  response_clone_ffi(TJsValue::to_js(self))
}

///|
/// [Response.body](https://developer.mozilla.org/en-US/docs/Web/API/Response/body)
impl TResponse with body(self : Self) -> ReadableStream {
  response_body_ffi(TJsValue::to_js(self))
}

///|
/// [Response.bodyUsed](https://developer.mozilla.org/en-US/docs/Web/API/Response/bodyUsed)
impl TResponse with body_used(self : Self) -> Bool {
  response_body_used_ffi(TJsValue::to_js(self))
}

///|
/// [Response.arrayBuffer](https://developer.mozilla.org/en-US/docs/Web/API/Response/arrayBuffer)
impl TResponse with array_buffer(self : Self) -> JsPromise[ArrayBuffer] {
  response_array_buffer_ffi(TJsValue::to_js(self))
}

///|
/// [Response.blob](https://developer.mozilla.org/en-US/docs/Web/API/Response/blob)
impl TResponse with blob(self : Self) -> JsPromise[Blob] {
  response_blob_ffi(TJsValue::to_js(self))
}

///|
/// [Response.bytes](https://developer.mozilla.org/en-US/docs/Web/API/Response/bytes)
impl TResponse with bytes(self : Self) -> JsPromise[Uint8Array] {
  response_bytes_ffi(TJsValue::to_js(self))
}

///|
/// [Response.formData](https://developer.mozilla.org/en-US/docs/Web/API/Response/formData)
impl TResponse with form_data(self : Self) -> JsPromise[FormData] {
  response_form_data_ffi(TJsValue::to_js(self))
}

///|
/// [Response.json](https://developer.mozilla.org/en-US/docs/Web/API/Response/json)
impl TResponse with json_body(self : Self) -> JsPromise[JsValue] {
  response_json_body_ffi(TJsValue::to_js(self))
}

///|
/// [Response.text](https://developer.mozilla.org/en-US/docs/Web/API/Response/text)
impl TResponse with text(self : Self) -> JsPromise[String] {
  response_text_ffi(TJsValue::to_js(self))
}

///|
#cfg(target="js")
extern "js" fn response_new_ffi(body : JsValue, init : JsValue) -> Response = "(body, init) => new Response(body, init)"

///|
#cfg(target="js")
extern "js" fn response_error_ffi_js() -> JsValue = "() => Response.error()"

///|
#cfg(target="js")
fn response_error_ffi() -> Response {
  response_error_ffi_js().unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_redirect_ffi_js(
  url : JsValue,
  status : JsValue,
) -> JsValue = "(url, status) => Response.redirect(url, status)"

///|
#cfg(target="js")
fn response_redirect_ffi(url : JsValue, status : JsValue) -> Response {
  response_redirect_ffi_js(url, status).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_json_ffi_js(data : JsValue, init : JsValue) -> JsValue = "(data, init) => Response.json(data, init)"

///|
#cfg(target="js")
fn response_json_ffi(data : JsValue, init : JsValue) -> Response {
  response_json_ffi_js(data, init).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_type_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.type"

///|
#cfg(target="js")
fn response_type_ffi(obj : JsValue) -> ResponseType {
  ResponseType::from_unchecked(response_type_ffi_js(obj).unsafe_cast())
}

///|
#cfg(target="js")
extern "js" fn response_url_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.url"

///|
#cfg(target="js")
fn response_url_ffi(obj : JsValue) -> String {
  response_url_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_redirected_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.redirected"

///|
#cfg(target="js")
fn response_redirected_ffi(obj : JsValue) -> Bool {
  response_redirected_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_status_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.status"

///|
#cfg(target="js")
fn response_status_ffi(obj : JsValue) -> UInt {
  response_status_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_ok_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.ok"

///|
#cfg(target="js")
fn response_ok_ffi(obj : JsValue) -> Bool {
  response_ok_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_status_text_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.statusText"

///|
#cfg(target="js")
fn response_status_text_ffi(obj : JsValue) -> String {
  response_status_text_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_headers_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.headers"

///|
#cfg(target="js")
fn response_headers_ffi(obj : JsValue) -> Headers {
  response_headers_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_clone_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.clone()"

///|
#cfg(target="js")
fn response_clone_ffi(obj : JsValue) -> Response {
  response_clone_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_body_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.body"

///|
#cfg(target="js")
fn response_body_ffi(obj : JsValue) -> ReadableStream {
  response_body_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_body_used_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.bodyUsed"

///|
#cfg(target="js")
fn response_body_used_ffi(obj : JsValue) -> Bool {
  response_body_used_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_array_buffer_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.arrayBuffer()"

///|
#cfg(target="js")
fn response_array_buffer_ffi(obj : JsValue) -> JsPromise[ArrayBuffer] {
  response_array_buffer_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_blob_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.blob()"

///|
#cfg(target="js")
fn response_blob_ffi(obj : JsValue) -> JsPromise[Blob] {
  response_blob_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_bytes_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.bytes()"

///|
#cfg(target="js")
fn response_bytes_ffi(obj : JsValue) -> JsPromise[Uint8Array] {
  response_bytes_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_form_data_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.formData()"

///|
#cfg(target="js")
fn response_form_data_ffi(obj : JsValue) -> JsPromise[FormData] {
  response_form_data_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_json_body_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.json()"

///|
#cfg(target="js")
fn response_json_body_ffi(obj : JsValue) -> JsPromise[JsValue] {
  response_json_body_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn response_text_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.text()"

///|
#cfg(target="js")
fn response_text_ffi(obj : JsValue) -> JsPromise[String] {
  response_text_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn response_new_ffi(body : JsValue, init : JsValue) -> Response = "webapi_Response" "new"

///|
#cfg(target="wasm-gc")
fn response_error_ffi() -> Response = "webapi_Response" "error"

///|
#cfg(target="wasm-gc")
fn response_redirect_ffi(url : JsValue, status : JsValue) -> Response = "webapi_Response" "redirect"

///|
#cfg(target="wasm-gc")
fn response_json_ffi(data : JsValue, init : JsValue) -> Response = "webapi_Response" "json"

///|
#cfg(target="wasm-gc")
fn response_type_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "get_type"

///|
#cfg(target="wasm-gc")
fn response_type_ffi(obj : JsValue) -> ResponseType {
  ResponseType::from_unchecked(jsvalue_to_string(response_type_ffi_wasm(obj)))
}

///|
#cfg(target="wasm-gc")
fn response_url_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "get_url"

///|
#cfg(target="wasm-gc")
fn response_url_ffi(obj : JsValue) -> String {
  jsvalue_to_string(response_url_ffi_wasm(obj))
}

///|
#cfg(target="wasm-gc")
fn response_redirected_ffi(obj : JsValue) -> Bool = "webapi_Response" "get_redirected"

///|
#cfg(target="wasm-gc")
fn response_status_ffi(obj : JsValue) -> UInt = "webapi_Response" "get_status"

///|
#cfg(target="wasm-gc")
fn response_ok_ffi(obj : JsValue) -> Bool = "webapi_Response" "get_ok"

///|
#cfg(target="wasm-gc")
fn response_status_text_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "get_statusText"

///|
#cfg(target="wasm-gc")
fn response_status_text_ffi(obj : JsValue) -> String {
  jsvalue_to_string(response_status_text_ffi_wasm(obj))
}

///|
#cfg(target="wasm-gc")
fn response_headers_ffi(obj : JsValue) -> Headers = "webapi_Response" "get_headers"

///|
#cfg(target="wasm-gc")
fn response_clone_ffi(obj : JsValue) -> Response = "webapi_Response" "clone"

///|
#cfg(target="wasm-gc")
fn response_body_ffi(obj : JsValue) -> ReadableStream = "webapi_Response" "get_body"

///|
#cfg(target="wasm-gc")
fn response_body_used_ffi(obj : JsValue) -> Bool = "webapi_Response" "get_bodyUsed"

///|
#cfg(target="wasm-gc")
fn response_array_buffer_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "arrayBuffer"

///|
#cfg(target="wasm-gc")
fn response_array_buffer_ffi(obj : JsValue) -> JsPromise[ArrayBuffer] {
  response_array_buffer_ffi_wasm(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn response_blob_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "blob"

///|
#cfg(target="wasm-gc")
fn response_blob_ffi(obj : JsValue) -> JsPromise[Blob] {
  response_blob_ffi_wasm(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn response_bytes_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "bytes"

///|
#cfg(target="wasm-gc")
fn response_bytes_ffi(obj : JsValue) -> JsPromise[Uint8Array] {
  response_bytes_ffi_wasm(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn response_form_data_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "formData"

///|
#cfg(target="wasm-gc")
fn response_form_data_ffi(obj : JsValue) -> JsPromise[FormData] {
  response_form_data_ffi_wasm(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn response_json_body_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "json_body"

///|
#cfg(target="wasm-gc")
fn response_json_body_ffi(obj : JsValue) -> JsPromise[JsValue] {
  response_json_body_ffi_wasm(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn response_text_ffi_wasm(obj : JsValue) -> JsValue = "webapi_Response" "text"

///|
#cfg(target="wasm-gc")
fn response_text_ffi(obj : JsValue) -> JsPromise[String] {
  response_text_ffi_wasm(obj).unsafe_cast()
}