///|
/// 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")
}
}