use js_sys::*;
use serde::{de::DeserializeOwned, Serialize};
use serde_wasm_bindgen::{from_value, to_value};
use wasm_bindgen::prelude::*;
use wasm_bindgen_futures::JsFuture;
use crate::common::{ErrMsg, WxError};
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = wx, js_name = saveFileToDisk)]
fn save_file_to_disk(params: &Object) -> bool;
}
pub async fn wx_save_file_to_disk<T>(path: T) -> Result<bool, WxError>
where
T: AsRef<str>,
{
let params = Object::new();
Reflect::set(
¶ms,
&JsValue::from("filePath"),
&JsValue::from(path.as_ref()),
)
.unwrap();
let promise = Promise::new(&mut |resolve, reject| {
let success_handler = move |res| -> Result<JsValue, JsValue> {
let _ = resolve.call1(&JsValue::NULL, &res);
Ok(JsValue::NULL)
};
let success_handler = Closure::wrap(
Box::new(success_handler) as Box<dyn Fn(JsValue) -> Result<JsValue, JsValue>>
);
let fail_handler = move |res| -> Result<JsValue, JsValue> {
let _ = reject.call1(&JsValue::NULL, &res);
Ok(JsValue::NULL)
};
let fail_handler = Closure::wrap(
Box::new(fail_handler) as Box<dyn Fn(JsValue) -> Result<JsValue, JsValue>>
);
Reflect::set(¶ms, &JsValue::from("success"), success_handler.as_ref()).unwrap();
success_handler.forget();
Reflect::set(¶ms, &JsValue::from("fail"), fail_handler.as_ref()).unwrap();
fail_handler.forget();
save_file_to_disk(¶ms);
});
let future = JsFuture::from(promise);
match future.await {
Ok(_info) => Ok(true),
Err(err) => Err(WxError::WxErrMsg(from_value::<ErrMsg>(err).unwrap())),
}
}