///|
fn main raise {
  let nodes : Array[@gmsh.Node] = [
    [0.0, 0.0, 0.0],
    [1.0, 0.0, 0.0],
    [0.0, 1.0, 0.0],
    [0.0, 0.0, 1.0],
  ].mapi((i, xyz) => {
    tag: (i + 1) * 10,
    xyz,
    dim: -1,
    entity: 0,
    parameters: [],
  })
  let source = @gmsh.mesh(nodes, [
    {
      tag: 77,
      kind: 4,
      nodes: [10, 20, 30, 40],
      entity: 0,
      physical: [],
      extra: [],
    },
  ])
  let boundary = source.extract_boundary()
  println(boundary.report().to_json().stringify())
  let surface = boundary.mesh()
  let reread = @gmsh.decode(surface.encode(version="4.1", binary=true))
  println("boundary elements: \{reread.elements().length()}")
}