wal-core 0.1.1

A framework for creating client-side single-page apps using Rust.
Documentation
macro_rules! define_events {
    ($($event:ident),*) => {
        $(
            pub struct $event(web_sys::$event);

            impl Deref for $event {
                type Target = web_sys::$event;

                fn deref(&self) -> &Self::Target {
                    &self.0
                }
            }

            impl $event {
                #[allow(dead_code)]
                fn new(event: web_sys::$event) -> Self {
                    Self(event)
                }
            }
        )*
    };
}

macro_rules! event_creators {
    ($($handler_name:ident ($event_type:ty)),*) => {
        $(
            struct $handler_name {
                event_type: Cow<'static, str>,
                callback: Callback<$event_type>,
            }

            impl EventCreator for $handler_name {
                fn get_event_type(&self) -> Cow<'static, str> {
                    self.event_type.clone()
                }

                fn create_callback(&self) -> Box<dyn FnMut(&web_sys::Event)> {
                    let callback = self.callback.clone();
                    Box::new(move |event: &web_sys::Event| {
                        let event = <$event_type>::new(event.clone().unchecked_into());
                        callback.emit(event);
                    })
                }
            }

            impl $handler_name {
                fn new(event_type: Cow<'static, str>, callback: Callback<$event_type>) -> Self {
                    Self {
                        event_type,
                        callback,
                    }
                }
            }

            impl EventCreatorType for $event_type {
                type Creator = $handler_name;
            }
        )*
    }
}

macro_rules! unspecialized_event_creators_constructor {
    ($($event_name:ident),*) => {
        $(
            #[allow(dead_code)]
            pub fn $event_name(callback: Callback<Event>) -> Box<dyn EventCreator> {
                Box::new(UnspecializedEventCreator {
                    event_type: Cow::from(stringify!($event_name)[2..].to_string()),
                    callback,
                })
            }
        )*
    };
}

macro_rules! event_creators_constructor {
    ($($event_name:ident ($event_type:ty) ),*) => {
        $(
            pub fn $event_name(callback: Callback<$event_type>) -> Box<dyn EventCreator> {
                Box::new(<$event_type as EventCreatorType>::Creator::new(
                    Cow::from(stringify!($event_name)[2..].to_string()),
                    callback
                ))
            }
        )*
    };
}