bevy_metamask/
lib.rs

1use std::marker::PhantomData;
2
3use bevy::{ecs::event::Event, prelude::*};
4
5mod provider;
6mod request;
7mod requests;
8mod resources;
9mod systems;
10
11pub use request::{MetamaskRequest, MetamaskResponse};
12pub use requests::*;
13use resources::MetamaskResponseEventReceiver;
14use systems::{on_metamask_request, on_metamask_response};
15
16pub trait MetamaskRequestEvent: Event {
17    type ResponseEvent: Event;
18
19    fn to_req(&self) -> MetamaskRequest;
20    fn from_resp(resp: MetamaskResponse) -> Self::ResponseEvent;
21}
22
23pub struct MetamaskPlugin<T: MetamaskRequestEvent> {
24    _marker: PhantomData<T>,
25}
26
27impl<T: MetamaskRequestEvent> MetamaskPlugin<T> {
28    pub fn new() -> Self {
29        Self {
30            _marker: PhantomData,
31        }
32    }
33}
34
35impl<T: MetamaskRequestEvent> Default for MetamaskPlugin<T> {
36    fn default() -> Self {
37        Self::new()
38    }
39}
40
41impl<T: MetamaskRequestEvent> Plugin for MetamaskPlugin<T> {
42    fn build(&self, app: &mut bevy::prelude::App) {
43        app.insert_resource(MetamaskResponseEventReceiver::<T::ResponseEvent>::new())
44            .add_event::<T>()
45            .add_event::<T::ResponseEvent>()
46            .add_system(on_metamask_request::<T>)
47            .add_system(on_metamask_response::<T>);
48    }
49}