// Generated by scripts/generate.mjs from bindings/api.mjs. Do not edit.

///|
#external
pub type UserData

///|
pub extern "js" fn UserData::keys(self : UserData) -> FixedArray[String] =
  #| (self) => Object.keys(self)

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

///|
pub extern "js" fn UserData::remove(self : UserData, key : String) -> Bool =
  #| (self, key) => { if (!Object.hasOwn(self, key)) return false; return delete self[key]; }

///|
extern "js" fn UserData::ffi_get_string(
  self : UserData,
  key : String,
) -> Nullable[String] =
  #| (self, key) => { const value = Object.hasOwn(self, key) ? self[key] : undefined; return typeof value === "string" ? value : null; }

///|
pub fn UserData::get_string(self : UserData, key : String) -> String? {
  self.ffi_get_string(key).to_option()
}

///|
pub extern "js" fn UserData::set_string(
  self : UserData,
  key : String,
  value : String,
) -> Unit =
  #| (self, key, value) => { Object.defineProperty(self, key, { value, enumerable: true, configurable: true, writable: true }); }

///|
extern "js" fn UserData::ffi_get_bool(
  self : UserData,
  key : String,
) -> Nullable[Bool] =
  #| (self, key) => { const value = Object.hasOwn(self, key) ? self[key] : undefined; return typeof value === "boolean" ? value : null; }

///|
pub fn UserData::get_bool(self : UserData, key : String) -> Bool? {
  self.ffi_get_bool(key).to_option()
}

///|
pub extern "js" fn UserData::set_bool(
  self : UserData,
  key : String,
  value : Bool,
) -> Unit =
  #| (self, key, value) => { Object.defineProperty(self, key, { value, enumerable: true, configurable: true, writable: true }); }

///|
extern "js" fn UserData::ffi_get_double(
  self : UserData,
  key : String,
) -> Nullable[Double] =
  #| (self, key) => { const value = Object.hasOwn(self, key) ? self[key] : undefined; return typeof value === "number" ? value : null; }

///|
pub fn UserData::get_double(self : UserData, key : String) -> Double? {
  self.ffi_get_double(key).to_option()
}

///|
pub extern "js" fn UserData::set_double(
  self : UserData,
  key : String,
  value : Double,
) -> Unit =
  #| (self, key, value) => { Object.defineProperty(self, key, { value, enumerable: true, configurable: true, writable: true }); }

///|
extern "js" fn UserData::ffi_get_int(
  self : UserData,
  key : String,
) -> Nullable[Int] =
  #| (self, key) => { const value = Object.hasOwn(self, key) ? self[key] : undefined; return Number.isInteger(value) && value >= -2147483648 && value <= 2147483647 ? value : null; }

///|
pub fn UserData::get_int(self : UserData, key : String) -> Int? {
  self.ffi_get_int(key).to_option()
}

///|
pub extern "js" fn UserData::set_int(
  self : UserData,
  key : String,
  value : Int,
) -> Unit =
  #| (self, key, value) => { Object.defineProperty(self, key, { value, enumerable: true, configurable: true, writable: true }); }

///|
extern "js" fn UserData::ffi_get_object(
  self : UserData,
  key : String,
) -> Nullable[UserData] =
  #| (self, key) => { const value = Object.hasOwn(self, key) ? self[key] : undefined; return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null; }

///|
pub fn UserData::get_object(self : UserData, key : String) -> UserData? {
  self.ffi_get_object(key).to_option()
}

///|
pub extern "js" fn UserData::set_object(
  self : UserData,
  key : String,
  value : UserData,
) -> Unit =
  #| (self, key, value) => { Object.defineProperty(self, key, { value, enumerable: true, configurable: true, writable: true }); }