summaryrefslogtreecommitdiff
path: root/core/extensions.rs
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-03-08 20:10:34 +0530
committerGitHub <noreply@github.com>2022-03-08 20:10:34 +0530
commite166d7eed0e2ccda15e19eda016f9a188c4e1dbd (patch)
tree693b7bef98c6debe40e0b719c00a1b16c83a96cb /core/extensions.rs
parent303d691a169e61a0ab38be48cdd2387c7573ed08 (diff)
feat(core): Event loop middlewares for Extensions (#13816)
Diffstat (limited to 'core/extensions.rs')
-rw-r--r--core/extensions.rs29
1 files changed, 29 insertions, 0 deletions
diff --git a/core/extensions.rs b/core/extensions.rs
index 587a2d061..031cb073a 100644
--- a/core/extensions.rs
+++ b/core/extensions.rs
@@ -1,12 +1,14 @@
use crate::OpFn;
use crate::OpState;
use anyhow::Error;
+use std::task::Context;
pub type SourcePair = (&'static str, Box<SourceLoadFn>);
pub type SourceLoadFn = dyn Fn() -> Result<String, Error>;
pub type OpPair = (&'static str, Box<OpFn>);
pub type OpMiddlewareFn = dyn Fn(&'static str, Box<OpFn>) -> Box<OpFn>;
pub type OpStateFn = dyn Fn(&mut OpState) -> Result<(), Error>;
+pub type OpEventLoopFn = dyn Fn(&mut OpState, &mut Context) -> bool;
#[derive(Default)]
pub struct Extension {
@@ -14,6 +16,7 @@ pub struct Extension {
ops: Option<Vec<OpPair>>,
opstate_fn: Option<Box<OpStateFn>>,
middleware_fn: Option<Box<OpMiddlewareFn>>,
+ event_loop_middleware: Option<Box<OpEventLoopFn>>,
initialized: bool,
}
@@ -56,6 +59,22 @@ impl Extension {
pub fn init_middleware(&mut self) -> Option<Box<OpMiddlewareFn>> {
self.middleware_fn.take()
}
+
+ pub fn init_event_loop_middleware(&mut self) -> Option<Box<OpEventLoopFn>> {
+ self.event_loop_middleware.take()
+ }
+
+ pub fn run_event_loop_middleware(
+ &self,
+ op_state: &mut OpState,
+ cx: &mut Context,
+ ) -> bool {
+ self
+ .event_loop_middleware
+ .as_ref()
+ .map(|f| f(op_state, cx))
+ .unwrap_or(false)
+ }
}
// Provides a convenient builder pattern to declare Extensions
@@ -65,6 +84,7 @@ pub struct ExtensionBuilder {
ops: Vec<OpPair>,
state: Option<Box<OpStateFn>>,
middleware: Option<Box<OpMiddlewareFn>>,
+ event_loop_middleware: Option<Box<OpEventLoopFn>>,
}
impl ExtensionBuilder {
@@ -94,6 +114,14 @@ impl ExtensionBuilder {
self
}
+ pub fn event_loop_middleware<F>(&mut self, middleware_fn: F) -> &mut Self
+ where
+ F: Fn(&mut OpState, &mut Context) -> bool + 'static,
+ {
+ self.event_loop_middleware = Some(Box::new(middleware_fn));
+ self
+ }
+
pub fn build(&mut self) -> Extension {
let js_files = Some(std::mem::take(&mut self.js));
let ops = Some(std::mem::take(&mut self.ops));
@@ -102,6 +130,7 @@ impl ExtensionBuilder {
ops,
opstate_fn: self.state.take(),
middleware_fn: self.middleware.take(),
+ event_loop_middleware: self.event_loop_middleware.take(),
initialized: false,
}
}