use std::ops::Deref; use cashu::nuts::nut00::{BlindedMessage, BlindedSignature, Proof}; use cashu::nuts::nut08::{MeltRequest, MeltResponse}; use wasm_bindgen::prelude::*; use crate::error::{into_err, Result}; use crate::types::{JsAmount, JsBolt11Invoice}; #[wasm_bindgen(js_name = MeltRequest)] pub struct JsMeltRequest { inner: MeltRequest, } impl Deref for JsMeltRequest { type Target = MeltRequest; fn deref(&self) -> &Self::Target { &self.inner } } impl From for JsMeltRequest { fn from(inner: MeltRequest) -> JsMeltRequest { JsMeltRequest { inner } } } #[wasm_bindgen(js_class = MeltRequest)] impl JsMeltRequest { #[wasm_bindgen(constructor)] pub fn new( proofs: JsValue, invoice: JsBolt11Invoice, outputs: JsValue, ) -> Result { let proofs: Vec = serde_wasm_bindgen::from_value(proofs).map_err(into_err)?; let outputs: Option> = if !outputs.is_null() { Some(serde_wasm_bindgen::from_value(outputs).map_err(into_err)?) } else { None }; Ok(JsMeltRequest { inner: MeltRequest { proofs, pr: invoice.deref().clone(), outputs, }, }) } /// Get Proofs #[wasm_bindgen(getter)] pub fn proofs(&self) -> Result { serde_wasm_bindgen::to_value(&self.inner.proofs).map_err(into_err) } /// Get Invoice #[wasm_bindgen(getter)] pub fn invoice(&self) -> JsBolt11Invoice { self.inner.pr.clone().into() } /// Get outputs #[wasm_bindgen(getter)] pub fn outputs(&self) -> Result { serde_wasm_bindgen::to_value(&self.inner.outputs).map_err(into_err) } } #[wasm_bindgen(js_name = MeltResponse)] pub struct JsMeltResponse { inner: MeltResponse, } impl Deref for JsMeltResponse { type Target = MeltResponse; fn deref(&self) -> &Self::Target { &self.inner } } impl From for JsMeltResponse { fn from(inner: MeltResponse) -> JsMeltResponse { JsMeltResponse { inner } } } #[wasm_bindgen(js_class = MeltResponse)] impl JsMeltResponse { #[wasm_bindgen(constructor)] pub fn new(paid: bool, preimage: Option, change: JsValue) -> Result { let change: Option> = if change.is_null() { Some(serde_wasm_bindgen::from_value(change).map_err(into_err)?) } else { None }; Ok(JsMeltResponse { inner: MeltResponse { paid, preimage, change, }, }) } /// Get Paid #[wasm_bindgen(getter)] pub fn paid(&self) -> bool { self.inner.paid } /// Get Preimage #[wasm_bindgen(getter)] pub fn preimage(&self) -> Option { self.inner.preimage.clone() } /// Get Change #[wasm_bindgen(getter)] pub fn change(&self) -> Result { serde_wasm_bindgen::to_value(&self.inner.change).map_err(into_err) } /// Change Amount #[wasm_bindgen(js_name = "changeAmount")] pub fn change_amount(&self) -> JsAmount { self.inner.change_amount().into() } }