use crate::CanPerformGeoLookup;
use wasm_bindgen::{prelude::wasm_bindgen, JsError, JsValue};
fn to_js<T: serde::Serialize>(value: &T) -> Result<JsValue, JsError> {
serde_wasm_bindgen::to_value(value).map_err(|e| JsError::new(&e.to_string()))
}
#[cfg(feature = "tz-ned")]
#[wasm_bindgen(js_name = getTimezoneNed, unchecked_return_type = "NedTimezoneResponse1[]")]
pub fn get_timezone_ned(lng: f32, lat: f32) -> Result<JsValue, JsError> {
let tzs = crate::NedTimezone::lookup(lng, lat).into_iter().map(crate::shared::NedTimezoneResponse1::from).collect::<Vec<_>>();
to_js(&tzs)
}
#[cfg(feature = "tz-osm")]
#[wasm_bindgen(js_name = getTimezoneOsm, unchecked_return_type = "OsmTimezoneResponse1[]")]
pub fn get_timezone_osm(lng: f32, lat: f32) -> Result<JsValue, JsError> {
let tzs = crate::OsmTimezone::lookup(lng, lat).into_iter().map(crate::shared::OsmTimezoneResponse1::from).collect::<Vec<_>>();
to_js(&tzs)
}
#[cfg(feature = "admin-osm")]
#[wasm_bindgen(js_name = getAdminOsm, unchecked_return_type = "OsmAdminResponse1[]")]
pub fn get_admin_osm(lng: f32, lat: f32) -> Result<JsValue, JsError> {
let admins = crate::OsmAdmin::lookup(lng, lat).into_iter().map(crate::shared::OsmAdminResponse1::from).collect::<Vec<_>>();
to_js(&admins)
}
#[cfg(test)]
mod tests {
use super::*;
use wasm_bindgen_test::wasm_bindgen_test;
fn prop(value: &JsValue, key: &str) -> JsValue {
js_sys::Reflect::get(value, &JsValue::from_str(key)).expect("property read failed")
}
#[cfg(feature = "tz-ned")]
#[wasm_bindgen_test]
fn ned_binding_returns_array_of_objects() {
let value = get_timezone_ned(-121.0, 46.0).expect("lookup should serialize");
assert!(js_sys::Array::is_array(&value), "expected a JS array, got a {:?}", value.js_typeof());
let first = js_sys::Array::from(&value).get(0);
assert_eq!(prop(&first, "identifier").as_string().as_deref(), Some("America/Los_Angeles"));
assert_eq!(prop(&first, "rawOffset").as_f64(), Some(-28800.0));
}
#[cfg(feature = "tz-osm")]
#[wasm_bindgen_test]
fn osm_binding_returns_array_of_objects() {
let value = get_timezone_osm(30.0, 30.0).expect("lookup should serialize");
assert!(js_sys::Array::is_array(&value), "expected a JS array, got a {:?}", value.js_typeof());
let first = js_sys::Array::from(&value).get(0);
assert_eq!(prop(&first, "identifier").as_string().as_deref(), Some("Africa/Cairo"));
}
}