///|
/// Execute one JSON request for CLI and cross-language integrations.
pub fn execute(request : Json) -> Json raise TopoError {
  let t = read(field(request, "topology").stringify())
  let name = match field(request, "name") {
    String(n) => n
    _ => ""
  }
  let names : Array[String] = array(field(request, "names")).map(n => {
    match n {
      String(s) => s
      _ => ""
    }
  })
  let boundary = match field(request, "boundary") {
    String("interior") => Interior
    String("exterior") => Exterior
    Null | String("all") => All
    _ => raise Invalid("request.boundary")
  }
  let named = if name == "" { None } else { Some(name) }
  match field(request, "op") {
    String("feature") => t.feature(name)
    String("bbox") =>
      match t.bbox() {
        Some(b) => b.to_json()
        None => Json::null()
      }
    String("neighbors") => t.neighbors(names).to_json()
    String("collection_neighbors") => t.collection_neighbors(name).to_json()
    String("mesh") => t.mesh(name?=named, boundary~)
    String("mesh_arcs") => t.mesh_arcs(name?=named, boundary~)
    String("merge") => t.merge(names)
    String("merge_arcs") => t.merge_arcs(names)
    String("quantize") | String("quantization_report") as op => {
      let grid = number(field(request, "grid"))
      if grid < 2.0 || grid > 1000000000.0 || grid != grid.to_int().to_double() {
        raise Invalid("request.grid")
      }
      if op == "quantize".to_json() {
        t.quantize(grid.to_int()).data
      } else {
        ToJson::to_json(t.quantization_report(grid.to_int()))
      }
    }
    String("dequantize") => t.dequantize().data
    String("prune") => t.prune(names).data
    String("statistics") => ToJson::to_json(t.statistics())
    _ => raise Invalid("request.op")
  }
}