#![cfg(feature = "wasm")]
use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;
#[derive(Serialize, Deserialize)]
struct Point2D {
x: f64,
y: f64,
}
impl Point2D {
fn to_tuple(&self) -> (f64, f64) {
(self.x, self.y)
}
fn from_tuple(t: (f64, f64)) -> Self {
Self { x: t.0, y: t.1 }
}
}
fn parse_points(js: JsValue) -> Result<Vec<Point2D>, JsValue> {
serde_wasm_bindgen::from_value(js).map_err(|e| JsValue::from_str(&e.to_string()))
}
#[wasm_bindgen]
pub fn polygon_area(points_json: JsValue) -> Result<f64, JsValue> {
let points = parse_points(points_json)?;
let tuples: Vec<(f64, f64)> = points.iter().map(|p| p.to_tuple()).collect();
Ok(crate::polygon::area(&tuples))
}
#[wasm_bindgen]
pub fn convex_hull(points_json: JsValue) -> Result<JsValue, JsValue> {
let points = parse_points(points_json)?;
let tuples: Vec<(f64, f64)> = points.iter().map(|p| p.to_tuple()).collect();
let hull = crate::polygon::convex_hull(&tuples);
let result: Vec<Point2D> = hull.into_iter().map(Point2D::from_tuple).collect();
serde_wasm_bindgen::to_value(&result).map_err(|e| JsValue::from_str(&e.to_string()))
}
#[wasm_bindgen]
pub fn point_in_polygon(point_json: JsValue, polygon_json: JsValue) -> Result<bool, JsValue> {
let pt: Point2D = serde_wasm_bindgen::from_value(point_json)
.map_err(|e| JsValue::from_str(&e.to_string()))?;
let polygon = parse_points(polygon_json)?;
let tuples: Vec<(f64, f64)> = polygon.iter().map(|p| p.to_tuple()).collect();
Ok(crate::polygon::contains_point(&tuples, pt.to_tuple()))
}