From bbc3e3a68e455831de28e5f3ba696c6e7de9186f Mon Sep 17 00:00:00 2001 From: Pauan Date: Fri, 28 May 2021 00:17:42 +0200 Subject: [PATCH] Adding in nightly feature and new events::Event type --- Cargo.toml | 1 + src/dom.rs | 2 ++ src/events.rs | 33 +++++++++++++++++++++++++++++++++ src/lib.rs | 3 +++ 4 files changed, 39 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index fdf3836..995de10 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ edition = "2018" [features] # TODO should this enable interning ? default = ["wasm-bindgen/enable-interning"] +nightly = [] [dependencies] lazy_static = "1.3.0" diff --git a/src/dom.rs b/src/dom.rs index ecab7a2..044d268 100644 --- a/src/dom.rs +++ b/src/dom.rs @@ -265,11 +265,13 @@ impl Dom { #[inline] fn create_element(name: &str) -> A where A: JsCast { + // TODO use unchecked_into in release mode ? bindings::create_element(intern(name)).dyn_into().unwrap_throw() } #[inline] fn create_element_ns(name: &str, namespace: &str) -> A where A: JsCast { + // TODO use unchecked_into in release mode ? bindings::create_element_ns(intern(namespace), intern(name)).dyn_into().unwrap_throw() } diff --git a/src/events.rs b/src/events.rs index ce32236..6db304e 100644 --- a/src/events.rs +++ b/src/events.rs @@ -3,6 +3,39 @@ use wasm_bindgen::JsCast; use web_sys::{EventTarget, HtmlInputElement, HtmlTextAreaElement}; +#[cfg(feature = "nightly")] +pub struct Event { + event: T, +} + +#[cfg(feature = "nightly")] +impl StaticEvent for Event where T: JsCast { + const EVENT_TYPE: &'static str = NAME; + + #[inline] + fn unchecked_from_event(event: web_sys::Event) -> Self { + Self { + // TODO use unchecked_into in release mode ? + event: event.dyn_into().unwrap(), + } + } +} + +// TODO code duplication +// TODO implement the rest of the methods +#[cfg(feature = "nightly")] +impl Event where T: AsRef { + #[inline] pub fn prevent_default(&self) { self.event.as_ref().prevent_default(); } + + #[inline] pub fn target(&self) -> Option { self.event.as_ref().target() } + + #[inline] + pub fn dyn_target(&self) -> Option where A: JsCast { + self.target()?.dyn_into().ok() + } +} + + macro_rules! make_event { ($name:ident, $type:literal => $event:path) => { #[derive(Debug)] diff --git a/src/lib.rs b/src/lib.rs index 99b024a..16fa737 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,9 @@ #![warn(unreachable_pub)] #![deny(warnings)] +#![cfg_attr(feature = "nightly", allow(incomplete_features))] +#![cfg_attr(feature = "nightly", feature(const_generics))] + #[macro_use] mod macros;