Skip to content

Commit ece6093

Browse files
committed
More renaming
1 parent 8887501 commit ece6093

File tree

8 files changed

+173
-172
lines changed

8 files changed

+173
-172
lines changed

src/definition.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,29 @@ use rquickjs::{
1010
///
1111
/// ```
1212
/// use rquickjs::{Ctx, JsLifetime, Object, Result};
13-
/// use rquickjs_module::{ModuleDefExt, ModuleImpl};
13+
/// use rquickjs_extension::{Extension, ModuleImpl};
1414
///
1515
/// #[derive(JsLifetime, Debug)]
16-
/// struct MyModuleOptions {
16+
/// struct MyExtensionOptions {
1717
/// user: String,
1818
/// }
1919
///
20-
/// struct MyModule {
21-
/// options: MyModuleOptions,
20+
/// struct MyExtension {
21+
/// options: MyExtensionOptions,
2222
/// }
2323
///
24-
/// impl MyModule {
24+
/// impl MyExtension {
2525
/// pub fn new<T: Into<String>>(user: T) -> Self {
2626
/// Self {
27-
/// options: MyModuleOptions {
27+
/// options: MyExtensionOptions {
2828
/// user: user.into(),
2929
/// },
3030
/// }
3131
/// }
3232
/// }
3333
///
34-
/// impl ModuleDefExt<MyModuleOptions> for MyModule {
35-
/// type Implementation = ModuleImpl<MyModuleOptions>;
34+
/// impl Extension<MyExtensionOptions> for MyExtension {
35+
/// type Implementation = ModuleImpl<MyExtensionOptions>;
3636
///
3737
/// fn implementation() -> &'static Self::Implementation {
3838
/// &ModuleImpl {
@@ -48,11 +48,11 @@ use rquickjs::{
4848
/// }
4949
/// }
5050
///
51-
/// fn options(self) -> MyModuleOptions {
51+
/// fn options(self) -> MyExtensionOptions {
5252
/// self.options
5353
/// }
5454
///
55-
/// fn globals(globals: &Object<'_>, options: &MyModuleOptions) -> Result<()> {
55+
/// fn globals(globals: &Object<'_>, options: &MyExtensionOptions) -> Result<()> {
5656
/// globals.set("user", options.user.clone())?;
5757
/// Ok(())
5858
/// }

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
//! that would allow it to have options as input and set global.
99
1010
pub use self::definition::{Extension, GlobalsOnly, ModuleImpl};
11-
pub use self::loader::{GlobalInitializer, ModuleLoader, ModuleLoaderBuilder, ModuleResolver};
11+
pub use self::loader::{ExtensionBuilder, GlobalInitializer, ModuleLoader, ModuleResolver};
1212

1313
mod definition;
1414
mod loader;

src/loader/builder.rs

Lines changed: 0 additions & 128 deletions
This file was deleted.

src/loader/loader.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use std::collections::HashMap;
2+
3+
use rquickjs::{loader::Loader, Ctx, Error, Module, Result};
4+
5+
use super::ModuleLoadFn;
6+
7+
/// Rquickjs [`Loader`](rquickjs::loader::Loader) for Rust modules
8+
/// defined using [`ModuleDefExt`](crate::ModuleDefExt).
9+
///
10+
/// See [`ModuleLoaderBuilder`] for usage.
11+
pub struct ModuleLoader {
12+
modules: HashMap<&'static str, ModuleLoadFn>,
13+
}
14+
15+
impl ModuleLoader {
16+
pub(crate) fn new(modules: HashMap<&'static str, ModuleLoadFn>) -> Self {
17+
Self { modules }
18+
}
19+
}
20+
21+
impl Loader for ModuleLoader {
22+
fn load<'js>(&mut self, ctx: &Ctx<'js>, path: &str) -> Result<Module<'js>> {
23+
let load = self
24+
.modules
25+
.remove(path)
26+
.ok_or_else(|| Error::new_loading(path))?;
27+
28+
(load)(ctx.clone(), Vec::from(path))
29+
}
30+
}

src/loader/mod.rs

Lines changed: 120 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,142 @@
1-
use std::collections::HashMap;
1+
use std::collections::{HashMap, HashSet};
22

3-
use rquickjs::{loader::Loader, Ctx, Error, Module, Object, Result};
3+
use rquickjs::{
4+
module::{Module, ModuleDef},
5+
Ctx, JsLifetime, Object, Result,
6+
};
47

5-
pub use self::builder::ModuleLoaderBuilder;
68
pub use self::global::GlobalInitializer;
9+
pub use self::loader::ModuleLoader;
710
pub use self::resolver::ModuleResolver;
11+
use crate::wrapper::{IntoModule, ModuleMeta};
812

9-
mod builder;
1013
mod global;
14+
#[allow(clippy::module_inception)]
15+
mod loader;
1116
mod resolver;
1217

1318
type GlobalLoadFn = Box<dyn for<'js> FnOnce(&Ctx<'js>, &Object<'js>) -> Result<()> + Send + Sync>;
1419
type ModuleLoadFn = for<'js> fn(Ctx<'js>, Vec<u8>) -> Result<Module<'js>>;
1520

16-
/// Rquickjs [`Loader`](rquickjs::loader::Loader) for Rust modules
17-
/// defined using [`ModuleDefExt`](crate::ModuleDefExt).
21+
fn load_module_func<D: ModuleDef>(ctx: Ctx<'_>, name: Vec<u8>) -> Result<Module<'_>> {
22+
Module::declare_def::<D, _>(ctx, name)
23+
}
24+
25+
/// Builder to create a [`ModuleLoader`], [`ModuleResolver`] and [`GlobalInitializer`]
26+
///
27+
/// # Example
28+
/// ```rust
29+
/// use rquickjs_module::{ModuleLoader, ModuleDefExt, ModuleImpl};
30+
///
31+
/// struct MyExtension;
32+
///
33+
/// impl Extension for MyExtension {
34+
/// type Implementation = ModuleImpl<()>;
1835
///
19-
/// See [`ModuleLoaderBuilder`] for usage.
20-
pub struct ModuleLoader {
36+
/// fn implementation() -> &'static Self::Implementation {
37+
/// &ModuleImpl {
38+
/// declare: |decl| {
39+
/// decl.declare("hello")?;
40+
/// Ok(())
41+
/// },
42+
/// evaluate: |ctx, exports, options| {
43+
/// exports.export("hello", "world".to_string())?;
44+
/// Ok(())
45+
/// },
46+
/// name: "my-module",
47+
/// }
48+
/// }
49+
///
50+
/// fn options(self) -> () {}
51+
/// }
52+
///
53+
/// ```
54+
#[derive(Default)]
55+
pub struct ExtensionBuilder {
2156
modules: HashMap<&'static str, ModuleLoadFn>,
57+
globals: Vec<GlobalLoadFn>,
58+
names: HashSet<&'static str>,
2259
}
2360

24-
impl ModuleLoader {
25-
pub(crate) fn new(modules: HashMap<&'static str, ModuleLoadFn>) -> Self {
26-
Self { modules }
61+
impl ExtensionBuilder {
62+
pub fn new() -> Self {
63+
Self::default()
2764
}
2865

29-
pub fn builder() -> ModuleLoaderBuilder {
30-
ModuleLoaderBuilder::default()
66+
#[must_use]
67+
pub fn with_extension<O, M, R>(mut self, extension: M) -> Self
68+
where
69+
for<'js> O: JsLifetime<'js> + Send + Sync + 'static,
70+
R: ModuleDef + ModuleMeta,
71+
M: IntoModule<O, R>,
72+
{
73+
self.process_extension(extension, None);
74+
self
75+
}
76+
77+
#[must_use]
78+
pub fn with_extension_named<O, M, R>(mut self, extension: M, name: &'static str) -> Self
79+
where
80+
for<'js> O: JsLifetime<'js> + Send + Sync + 'static,
81+
R: ModuleDef + ModuleMeta,
82+
M: IntoModule<O, R>,
83+
{
84+
self.process_extension(extension, Some(name));
85+
self
3186
}
32-
}
3387

34-
impl Loader for ModuleLoader {
35-
fn load<'js>(&mut self, ctx: &Ctx<'js>, path: &str) -> Result<Module<'js>> {
36-
let load = self
37-
.modules
38-
.remove(path)
39-
.ok_or_else(|| Error::new_loading(path))?;
88+
pub fn add_extension<O, M, R>(&mut self, extension: M) -> &mut Self
89+
where
90+
for<'js> O: JsLifetime<'js> + Send + Sync + 'static,
91+
R: ModuleDef + ModuleMeta,
92+
M: IntoModule<O, R>,
93+
{
94+
self.process_extension(extension, None)
95+
}
96+
97+
pub fn add_extension_named<O, M, R>(&mut self, extension: M, name: &'static str) -> &mut Self
98+
where
99+
for<'js> O: JsLifetime<'js> + Send + Sync + 'static,
100+
R: ModuleDef + ModuleMeta,
101+
M: IntoModule<O, R>,
102+
{
103+
self.process_extension(extension, Some(name))
104+
}
105+
106+
fn process_extension<O, M, R>(&mut self, extension: M, name: Option<&'static str>) -> &mut Self
107+
where
108+
for<'js> O: JsLifetime<'js> + Send + Sync + 'static,
109+
R: ModuleDef + ModuleMeta,
110+
M: IntoModule<O, R>,
111+
{
112+
let o = extension.options();
113+
114+
// Create a new closure that explicitly captures 'js lifetime
115+
let globals_fn = move |ctx: &Ctx<'_>, globals: &Object<'_>| {
116+
let globals_fn = M::globals;
117+
globals_fn(globals, &o)?;
118+
let _ = ctx.store_userdata(o);
119+
Ok(())
120+
};
121+
122+
// Box the closure with explicit lifetime bounds
123+
let boxed_globals: GlobalLoadFn = Box::new(globals_fn);
124+
125+
if R::is_module() {
126+
let name = name.unwrap_or(R::name());
127+
self.names.insert(name);
128+
self.modules.insert(name, load_module_func::<R>);
129+
}
130+
131+
self.globals.push(boxed_globals);
132+
self
133+
}
40134

41-
(load)(ctx.clone(), Vec::from(path))
135+
pub fn build(self) -> (ModuleLoader, ModuleResolver, GlobalInitializer) {
136+
(
137+
ModuleLoader::new(self.modules),
138+
ModuleResolver::new(self.names),
139+
GlobalInitializer::new(self.globals),
140+
)
42141
}
43142
}

0 commit comments

Comments
 (0)