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

///|
#external
pub type MeshTopology

///|
#module("@mizchi/three-mbt/topology")
extern "js" fn MeshTopology::ffi_create_MeshTopology(
  geometry : BufferGeometry,
) -> JsResult[MeshTopology] = "meshTopologyChecked"

///|
pub fn MeshTopology::MeshTopology(
  geometry : BufferGeometry,
) -> MeshTopology raise ModelingError {
  match MeshTopology::ffi_create_MeshTopology(geometry).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
#module("@mizchi/three-mbt/topology")
extern "js" fn MeshTopology::ffi_create_from_welded(
  geometry : BufferGeometry,
  tolerance : Double,
) -> JsResult[MeshTopology] = "meshTopologyWeldedChecked"

///|
pub fn MeshTopology::from_welded(
  geometry : BufferGeometry,
  tolerance : Double,
) -> MeshTopology raise ModelingError {
  match
    MeshTopology::ffi_create_from_welded(geometry, tolerance).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
pub extern "js" fn MeshTopology::vertices(
  self : MeshTopology,
) -> FixedArray[MeshVertexId] =
  #| (self) => self.vertices()

///|
extern "js" fn MeshTopology::ffi_vertex_id(
  self : MeshTopology,
  index : Int,
) -> Nullable[MeshVertexId] =
  #| (self, index) => self.vertexId(index)

///|
pub fn MeshTopology::vertex_id(
  self : MeshTopology,
  index : Int,
) -> MeshVertexId? {
  self.ffi_vertex_id(index).to_option()
}

///|
pub extern "js" fn MeshTopology::edges(
  self : MeshTopology,
) -> FixedArray[MeshEdgeId] =
  #| (self) => self.edges()

///|
extern "js" fn MeshTopology::ffi_edge_id(
  self : MeshTopology,
  index : Int,
) -> Nullable[MeshEdgeId] =
  #| (self, index) => self.edgeId(index)

///|
pub fn MeshTopology::edge_id(self : MeshTopology, index : Int) -> MeshEdgeId? {
  self.ffi_edge_id(index).to_option()
}

///|
pub extern "js" fn MeshTopology::faces(
  self : MeshTopology,
) -> FixedArray[MeshFaceId] =
  #| (self) => self.faces()

///|
extern "js" fn MeshTopology::ffi_face_id(
  self : MeshTopology,
  index : Int,
) -> Nullable[MeshFaceId] =
  #| (self, index) => self.faceId(index)

///|
pub fn MeshTopology::face_id(self : MeshTopology, index : Int) -> MeshFaceId? {
  self.ffi_face_id(index).to_option()
}

///|
extern "js" fn MeshTopology::ffi_vertex_position(
  self : MeshTopology,
  id : MeshVertexId,
) -> JsResult[Vector3] =
  #| (self, id) => { try { return { ok: true, value: (() => self.vertexPosition(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::vertex_position(
  self : MeshTopology,
  id : MeshVertexId,
) -> Vector3 raise ModelingError {
  match self.ffi_vertex_position(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_source_indices(
  self : MeshTopology,
  id : MeshVertexId,
) -> JsResult[FixedArray[Int]] =
  #| (self, id) => { try { return { ok: true, value: (() => self.sourceIndices(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::source_indices(
  self : MeshTopology,
  id : MeshVertexId,
) -> FixedArray[Int] raise ModelingError {
  match self.ffi_source_indices(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_vertex_edges(
  self : MeshTopology,
  id : MeshVertexId,
) -> JsResult[FixedArray[MeshEdgeId]] =
  #| (self, id) => { try { return { ok: true, value: (() => self.vertexEdges(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::vertex_edges(
  self : MeshTopology,
  id : MeshVertexId,
) -> FixedArray[MeshEdgeId] raise ModelingError {
  match self.ffi_vertex_edges(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_vertex_faces(
  self : MeshTopology,
  id : MeshVertexId,
) -> JsResult[FixedArray[MeshFaceId]] =
  #| (self, id) => { try { return { ok: true, value: (() => self.vertexFaces(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::vertex_faces(
  self : MeshTopology,
  id : MeshVertexId,
) -> FixedArray[MeshFaceId] raise ModelingError {
  match self.ffi_vertex_faces(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_edge_vertices(
  self : MeshTopology,
  id : MeshEdgeId,
) -> JsResult[FixedArray[MeshVertexId]] =
  #| (self, id) => { try { return { ok: true, value: (() => self.edgeVertices(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::edge_vertices(
  self : MeshTopology,
  id : MeshEdgeId,
) -> FixedArray[MeshVertexId] raise ModelingError {
  match self.ffi_edge_vertices(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_edge_faces(
  self : MeshTopology,
  id : MeshEdgeId,
) -> JsResult[FixedArray[MeshFaceId]] =
  #| (self, id) => { try { return { ok: true, value: (() => self.edgeFaces(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::edge_faces(
  self : MeshTopology,
  id : MeshEdgeId,
) -> FixedArray[MeshFaceId] raise ModelingError {
  match self.ffi_edge_faces(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_face_vertices(
  self : MeshTopology,
  id : MeshFaceId,
) -> JsResult[FixedArray[MeshVertexId]] =
  #| (self, id) => { try { return { ok: true, value: (() => self.faceVertices(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::face_vertices(
  self : MeshTopology,
  id : MeshFaceId,
) -> FixedArray[MeshVertexId] raise ModelingError {
  match self.ffi_face_vertices(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_face_edges(
  self : MeshTopology,
  id : MeshFaceId,
) -> JsResult[FixedArray[MeshEdgeId]] =
  #| (self, id) => { try { return { ok: true, value: (() => self.faceEdges(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::face_edges(
  self : MeshTopology,
  id : MeshFaceId,
) -> FixedArray[MeshEdgeId] raise ModelingError {
  match self.ffi_face_edges(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_connected_faces(
  self : MeshTopology,
  id : MeshFaceId,
) -> JsResult[FixedArray[MeshFaceId]] =
  #| (self, id) => { try { return { ok: true, value: (() => self.connectedFaces(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::connected_faces(
  self : MeshTopology,
  id : MeshFaceId,
) -> FixedArray[MeshFaceId] raise ModelingError {
  match self.ffi_connected_faces(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn MeshTopology::ffi_face_normal(
  self : MeshTopology,
  id : MeshFaceId,
) -> JsResult[Vector3] =
  #| (self, id) => { try { return { ok: true, value: (() => self.faceNormal(id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn MeshTopology::face_normal(
  self : MeshTopology,
  id : MeshFaceId,
) -> Vector3 raise ModelingError {
  match self.ffi_face_normal(id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
pub extern "js" fn MeshTopology::boundary_edges(
  self : MeshTopology,
) -> FixedArray[MeshEdgeId] =
  #| (self) => self.boundaryEdges()

///|
pub extern "js" fn MeshTopology::nonmanifold_edges(
  self : MeshTopology,
) -> FixedArray[MeshEdgeId] =
  #| (self) => self.nonmanifoldEdges()

///|
pub extern "js" fn MeshTopology::inconsistent_edges(
  self : MeshTopology,
) -> FixedArray[MeshEdgeId] =
  #| (self) => self.inconsistentEdges()

///|
pub extern "js" fn MeshTopology::degenerate_faces(
  self : MeshTopology,
) -> FixedArray[MeshFaceId] =
  #| (self) => self.degenerateFaces()

///|
pub extern "js" fn MeshTopology::geometry(
  self : MeshTopology,
) -> BufferGeometry =
  #| (self) => self.geometry()