bevy_metamask 0.1.0

Bevy plugin that supports metamask in browser
Documentation
use serde::Deserialize;
use wasm_bindgen::JsValue;

use crate::{provider::Provider, *};

#[derive(Debug, Clone)]
pub enum MetamaskRequest {
    BlockNumber(BlockNumber),
    GetBalance(GetBalance),
    RequestAccounts(RequestAccounts),
    Call(Call),
    SendTransaction(SendTransaction),
}

#[derive(Debug, Clone)]
pub enum MetamaskResponse {
    BlockNumber(String),
    GetBalance(String),
    RequestAccounts(Vec<String>),
    Call(String),
    SendTransaction(String),
}

pub trait MetamaskRequestTrait {
    type Response: 'static + for<'a> Deserialize<'a>;

    fn to_js_value(&self) -> JsValue;
    fn resp_into_event(resp: Self::Response) -> MetamaskResponse;
}

pub async fn request<R: 'static + MetamaskRequestTrait + std::marker::Send>(
    req: R,
) -> Result<MetamaskResponse, JsValue> {
    let result = Provider::new().async_request(req.to_js_value()).await;
    match result {
        Ok(resp) => match serde_wasm_bindgen::from_value(resp) {
            Ok(resp) => Ok(R::resp_into_event(resp)),
            Err(err) => Err(err.into()),
        },
        Err(err) => Err(err),
    }
}