use super::XYZ;
use crate::observer::Observer;
use nalgebra::Vector3;
use wasm_bindgen::prelude::wasm_bindgen;
#[wasm_bindgen]
impl XYZ {
#[wasm_bindgen(constructor, variadic)]
pub fn new_js(x: f64, y: f64, opt: &js_sys::Array) -> Result<XYZ, crate::error::Error> {
use crate::error::Error;
use wasm_bindgen::convert::TryFromJsValue;
let (x, y, z, obs) = match opt.length() {
0 => (
x * 100.0 / y,
100.0,
(1.0 - x - y) * 100.0 / y,
Observer::Cie1931,
),
1 => {
if opt.get(0).as_f64().is_some() {
(x, y, opt.get(0).as_f64().unwrap(), Observer::Cie1931)
} else {
let obs = Observer::try_from_js_value(opt.get(0))?;
(x * 100.0 / y, 100.0, (1.0 - x - y) * 100.0 / y, obs)
}
}
2 => {
let z = opt.get(0).as_f64().ok_or(Error::ErrorString(
"please provide a z value as number".into(),
))?;
let obs = Observer::try_from_js_value(opt.get(1))?;
(x, y, z, obs)
}
_ => {
return Err(Error::ErrorString(
"Invalid Arguments for XYZ constructor".into(),
));
}
};
if x < 0.0 || y < 0.0 || z < 0.0 {
return Err(Error::ErrorString(
"XYZ values should be all positive values".into(),
));
}
Ok(XYZ::from_vec(Vector3::new(x, y, z), obs))
}
#[wasm_bindgen(js_name=values)]
pub fn values_js(&self) -> js_sys::Array {
let &[x, y, z] = self.xyz.as_ref();
js_sys::Array::of3(&x.into(), &y.into(), &z.into())
}
#[wasm_bindgen(js_name=chromaticity)]
pub fn chromaticity_js(&self) -> js_sys::Array {
let [x, y] = self.chromaticity().to_array();
js_sys::Array::of2(&x.into(), &y.into())
}
#[wasm_bindgen(js_name=y)]
pub fn y_js(&self) -> f64 {
self.y()
}
}