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}