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

///|
#external
pub type MaterialLoader

///|
#module("@mizchi/three-mbt/constructors")
pub extern "js" fn MaterialLoader::MaterialLoader() -> MaterialLoader = "materialLoader"

///|
pub fn MaterialLoader::as_loader(self : MaterialLoader) -> Loader = "%identity"

///|
extern "js" fn MaterialLoader::ffi_load(
  self : MaterialLoader,
  url : String,
) -> @js_async.Promise[Material] =
  #| (self, url) => Promise.resolve().then(() => self.loadAsync(url))

///|
pub async fn MaterialLoader::load(
  self : MaterialLoader,
  url : String,
) -> Material raise LoadError {
  try {
    let value = self.ffi_load(url).wait()
    value
  } catch {
    error => raise LoadError((error : Error).to_string())
  }
}

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

///|
pub fn MaterialLoader::parse_json(
  self : MaterialLoader,
  json : Json,
) -> Material raise LoadError {
  match self.ffi_parse_json(json.stringify()).into_result() {
    Ok(value) => value
    Err(message) => raise LoadError(message)
  }
}

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

///|
pub fn MaterialLoader::parse_json_string(
  self : MaterialLoader,
  text : String,
) -> Material raise LoadError {
  match self.ffi_parse_json_string(text).into_result() {
    Ok(value) => value
    Err(message) => raise LoadError(message)
  }
}

///|
pub extern "js" fn MaterialLoader::textures(
  self : MaterialLoader,
) -> TextureDictionary =
  #| (self) => self.textures

///|
pub extern "js" fn MaterialLoader::set_textures(
  self : MaterialLoader,
  textures : TextureDictionary,
) -> MaterialLoader =
  #| (self, textures) => self.setTextures(textures)

///|
extern "js" fn MaterialLoader::ffi_create_material_from_type(
  self : MaterialLoader,
  name : String,
) -> JsResult[Material] =
  #| (self, name) => { try { return { ok: true, value: (() => self.createMaterialFromType(name))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MaterialLoader::create_material_from_type(
  self : MaterialLoader,
  name : String,
) -> Material raise LoadError {
  match self.ffi_create_material_from_type(name).into_result() {
    Ok(value) => value
    Err(message) => raise LoadError(message)
  }
}