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

///|
#external
pub type SVGLoader

///|
#module("@mizchi/three-mbt/modeling-io")
pub extern "js" fn SVGLoader::SVGLoader() -> SVGLoader = "sVGLoader"

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

///|
pub extern "js" fn SVGLoader::default_dpi(self : SVGLoader) -> Double =
  #| (self) => self.defaultDPI

///|
pub extern "js" fn SVGLoader::set_default_dpi(
  self : SVGLoader,
  value : Double,
) -> Unit =
  #| (self, value) => { self.defaultDPI = value; }

///|
pub extern "js" fn SVGLoader::default_unit(self : SVGLoader) -> String =
  #| (self) => self.defaultUnit

///|
pub extern "js" fn SVGLoader::set_default_unit(
  self : SVGLoader,
  value : String,
) -> Unit =
  #| (self, value) => { self.defaultUnit = value; }

///|
extern "js" fn SVGLoader::ffi_parse(
  self : SVGLoader,
  text : String,
) -> JsResult[SVGResult] =
  #| (self, text) => { try { return { ok: true, value: (() => { const result = self.parse(text); if (result.xml.querySelector("parsererror") || result.xml.localName !== "svg") throw new Error("Invalid SVG document"); return result; })() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn SVGLoader::parse(
  self : SVGLoader,
  text : String,
) -> SVGResult raise LoadError {
  match self.ffi_parse(text).into_result() {
    Ok(value) => value
    Err(message) => raise LoadError(message)
  }
}

///|
extern "js" fn SVGLoader::ffi_load(
  self : SVGLoader,
  url : String,
) -> @js_async.Promise[SVGResult] =
  #| (self, url) => Promise.resolve().then(() => self.loadAsync(url).then(result => { if (result.xml.querySelector("parsererror") || result.xml.localName !== "svg") throw new Error("Invalid SVG document"); return result; }))

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

///|
extern "js" fn SVGLoader::ffi_points_to_stroke(
  self : SVGLoader,
  points : FixedArray[Vector2],
  style : StrokeStyle,
  arc_divisions : Int,
  min_distance : Double,
) -> Nullable[BufferGeometry] =
  #| (self, points, style, arc_divisions, min_distance) => self.constructor.pointsToStroke(points, style, arc_divisions, min_distance)

///|
pub fn SVGLoader::points_to_stroke(
  self : SVGLoader,
  points : FixedArray[Vector2],
  style : StrokeStyle,
  arc_divisions : Int,
  min_distance : Double,
) -> BufferGeometry? {
  self
  .ffi_points_to_stroke(points, style, arc_divisions, min_distance)
  .to_option()
}

///|
extern "js" fn SVGLoader::ffi_create_fill_material(
  self : SVGLoader,
  path : ShapePath,
) -> Nullable[MeshBasicMaterial] =
  #| (self, path) => self.constructor.createFillMaterial(path)

///|
pub fn SVGLoader::create_fill_material(
  self : SVGLoader,
  path : ShapePath,
) -> MeshBasicMaterial? {
  self.ffi_create_fill_material(path).to_option()
}

///|
extern "js" fn SVGLoader::ffi_create_stroke_material(
  self : SVGLoader,
  path : ShapePath,
) -> Nullable[MeshBasicMaterial] =
  #| (self, path) => self.constructor.createStrokeMaterial(path)

///|
pub fn SVGLoader::create_stroke_material(
  self : SVGLoader,
  path : ShapePath,
) -> MeshBasicMaterial? {
  self.ffi_create_stroke_material(path).to_option()
}