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

///|
#external
pub type GLTFDefinition

///|
pub fn GLTFDefinition::as_user_data(self : GLTFDefinition) -> UserData = "%identity"

///|
extern "js" fn GLTFDefinition::ffi_extensions(
  self : GLTFDefinition,
) -> Nullable[UserData] =
  #| (self) => self.extensions

///|
pub fn GLTFDefinition::extensions(self : GLTFDefinition) -> UserData? {
  self.ffi_extensions().to_option()
}

///|
extern "js" fn GLTFDefinition::ffi_set_extension(
  self : GLTFDefinition,
  name : String,
  value : String,
) -> JsResult[Unit] =
  #| (self, name, value) => { try { return { ok: true, value: (() => { if(!self.extensions)self.extensions={};Object.defineProperty(self.extensions,name,{value:JSON.parse(value),enumerable:true,writable:true,configurable:true}); })() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn GLTFDefinition::set_extension(
  self : GLTFDefinition,
  name : String,
  value : Json,
) -> Unit raise SerializationError {
  match self.ffi_set_extension(name, value.stringify()).into_result() {
    Ok(value) => value
    Err(message) => raise SerializationError(message)
  }
}

///|
extern "js" fn GLTFDefinition::ffi_json(
  self : GLTFDefinition,
) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn GLTFDefinition::json(
  self : GLTFDefinition,
) -> Json raise SerializationError {
  match self.ffi_json().into_result() {
    Ok(value) =>
      @json.parse(value) catch {
        error => raise SerializationError((error : Error).to_string())
      }
    Err(message) => raise SerializationError(message)
  }
}