rusnap_api/
request.rs

1use rusnap_utils::{JsResult, RPCRequest};
2use serde::{Deserialize, Serialize};
3use serde_wasm_bindgen::Serializer;
4use wasm_bindgen::{prelude::wasm_bindgen, JsValue};
5
6use crate::{Error, Result};
7
8#[wasm_bindgen]
9extern "C" {
10    #[wasm_bindgen(js_namespace = snap, js_name = request, catch)]
11    async fn _request(args: JsValue) -> JsResult<JsValue>;
12}
13
14/// Call metamask using `snap.request`.
15///
16/// This function used to call restricted methods.
17///
18/// Snap Document: [Restricted methods](https://docs.metamask.io/snaps/reference/rpc-api/#restricted-methods)
19pub async fn request<P, R>(method: &'static str, params: P) -> Result<R>
20where
21    P: Serialize,
22    R: for<'de> Deserialize<'de>,
23{
24    let req = RPCRequest { method, params };
25
26    let sers = Serializer::default().serialize_maps_as_objects(true);
27
28    let req = req.serialize(&sers)?;
29
30    log::debug!("Rpc Call Request is: {:?}", req);
31
32    let resp = _request(req).await.map_err(Error::JsError)?;
33
34    log::debug!("Rpc Call Result is: {:?}", resp);
35
36    Ok(serde_wasm_bindgen::from_value(resp)?)
37}