Skip to main content

exact_poly/wasm/
validation.rs

1use wasm_bindgen::prelude::*;
2
3use super::helpers::*;
4
5#[wasm_bindgen]
6pub fn is_convex(ring_flat: &[i64]) -> Result<bool, JsValue> {
7    let ring = parse_flat_ring(ring_flat)?;
8    Ok(crate::validation::is_convex(&ring))
9}
10
11#[wasm_bindgen(skip_typescript)]
12pub fn validate_edge_lengths(
13    ring_flat: &[i64],
14    config: Option<JsValue>,
15) -> Result<Option<String>, JsValue> {
16    let ring = parse_flat_ring(ring_flat)?;
17    let config = parse_config(config)?;
18    Ok(crate::validation::validate_edge_lengths(&ring, &config))
19}
20
21#[wasm_bindgen]
22pub fn perimeter_l1(ring_flat: &[i64]) -> Result<String, JsValue> {
23    let ring = parse_flat_ring(ring_flat)?;
24    Ok(crate::validation::perimeter_l1(&ring).to_string())
25}
26
27/// Boundary-level compactness check. Apply to a whole polygon's outer
28/// boundary (single part, or the union boundary of a multipart polygon).
29/// NOT intended for individual parts of a multipart polygon — that would be
30/// stricter than on-chain and reject legitimate decompositions.
31#[wasm_bindgen(skip_typescript)]
32pub fn validate_compactness(
33    twice_area: &str,
34    perimeter: &str,
35    config: Option<JsValue>,
36) -> Result<Option<String>, JsValue> {
37    let twice_area = parse_u128_str(twice_area, "twice_area")?;
38    let perimeter = parse_u128_str(perimeter, "perimeter")?;
39    let config = parse_config(config)?;
40    Ok(crate::validation::validate_compactness(
41        twice_area, perimeter, &config,
42    ))
43}
44
45/// Per-part structural validation mirroring polygon.move's `part()` entry:
46/// vertex-count bounds, weak convexity, and minimum edge length.
47///
48/// Breaking change (was: also enforced compactness). Compactness is a
49/// boundary-level property; call `validate_multipart_topology` (or the
50/// full on-chain validator) to check the assembled polygon instead.
51#[wasm_bindgen(skip_typescript)]
52pub fn validate_part(
53    ring_flat: &[i64],
54    config: Option<JsValue>,
55) -> Result<Option<String>, JsValue> {
56    let ring = parse_flat_ring(ring_flat)?;
57    let config = parse_config(config)?;
58    Ok(crate::validation::validate_part(&ring, &config))
59}