floating-ui 0.0.1

Rust bindings for Floating UI
Documentation
use wasm_bindgen::prelude::*;

use crate::{core::Middleware, Result};

#[wasm_bindgen(js_namespace= ["window", "FloatingUIDOM"])]
extern "C" {
    #[wasm_bindgen(js_name = offset)]
    fn js_offset(options: JsValue) -> JsValue;

}

pub fn offset(options: OffsetOptions) -> Result<Middleware> {
    let js = js_offset(options.into());
    Ok(js.try_into()?)
}

pub enum OffsetOptions {
    Number(f64),
    Object {
        main_axis: Option<f64>,
        cross_axis: Option<f64>,
        alignment_axis: Option<f64>,
    },
}

impl Into<JsValue> for OffsetOptions {
    fn into(self) -> JsValue {
        match self {
            OffsetOptions::Number(value) => JsValue::from_f64(value),
            OffsetOptions::Object {
                main_axis,
                cross_axis,
                alignment_axis,
            } => {
                let obj = js_sys::Object::new();
                if let Some(value) = main_axis {
                    js_sys::Reflect::set(
                        &obj,
                        &JsValue::from_str("mainAxis"),
                        &JsValue::from_f64(value),
                    )
                    .unwrap();
                }
                if let Some(value) = cross_axis {
                    js_sys::Reflect::set(
                        &obj,
                        &JsValue::from_str("crossAxis"),
                        &JsValue::from_f64(value),
                    )
                    .unwrap();
                }
                if let Some(value) = alignment_axis {
                    js_sys::Reflect::set(
                        &obj,
                        &JsValue::from_str("alignmentAxis"),
                        &JsValue::from_f64(value),
                    )
                    .unwrap();
                }
                obj.into()
            }
        }
    }
}