///|
// Bound decoded output before materialization; repeated references can expand tiny inputs.
fn check_expansion(data : Json) -> Unit raise TopoError {
let arcs = array(field(data, "arcs"))
let mut expanded = 0
let mut refs = 0
for g in array_objects(data) {
for r in geometry_refs(g) {
refs += 1
expanded += array(arcs[arc_id(r)]).length()
if refs > 100000 || expanded > 2000000 {
raise Invalid("limit.expansion")
}
}
}
}
///|
fn array_objects(data : Json) -> Array[Json] {
match field(data, "objects") {
Object(m) => m.values().collect()
_ => []
}
}