Skip to content

Commit a0c148c

Browse files
committed
factors: Fix derive macro
Signed-off-by: Lann Martin <[email protected]>
1 parent d6a0408 commit a0c148c

File tree

7 files changed

+66
-62
lines changed

7 files changed

+66
-62
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/factor-wasi/src/lib.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
pub mod preview1;
22

3-
use spin_factors::{
4-
Factor, FactorInstancePreparer, InitContext, PrepareContext, Result, SpinFactors,
5-
};
3+
use spin_factors::{Factor, InitContext, InstancePreparer, PrepareContext, Result, SpinFactors};
64
use wasmtime_wasi::{ResourceTable, WasiCtx, WasiCtxBuilder, WasiView};
75

86
pub struct WasiFactor;
@@ -48,7 +46,7 @@ pub struct Builder {
4846
wasi_ctx: WasiCtxBuilder,
4947
}
5048

51-
impl FactorInstancePreparer<WasiFactor> for Builder {
49+
impl InstancePreparer<WasiFactor> for Builder {
5250
fn new<Factors: SpinFactors>(
5351
_factor: &WasiFactor,
5452
_ctx: PrepareContext<Factors>,

crates/factor-wasi/src/preview1.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use spin_factors::{
2-
Factor, FactorInstancePreparer, ModuleInitContext, PrepareContext, Result, SpinFactors,
2+
Factor, InstancePreparer, ModuleInitContext, PrepareContext, Result, SpinFactors,
33
};
44
use wasmtime_wasi::{preview1::WasiP1Ctx, WasiCtxBuilder};
55

@@ -21,7 +21,7 @@ pub struct Builder {
2121
wasi_ctx: WasiCtxBuilder,
2222
}
2323

24-
impl FactorInstancePreparer<WasiPreview1Factor> for Builder {
24+
impl InstancePreparer<WasiPreview1Factor> for Builder {
2525
fn new<Factors: SpinFactors>(
2626
_factor: &WasiPreview1Factor,
2727
_ctx: PrepareContext<Factors>,

crates/factors-derive/src/lib.rs

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ fn expand_factors(input: &DeriveInput) -> syn::Result<TokenStream> {
2020
let name = &input.ident;
2121
let vis = &input.vis;
2222

23-
let builders_name = format_ident!("{name}Builders");
24-
let data_name = format_ident!("{name}InstanceState");
23+
let preparers_name = format_ident!("{name}InstancePreparers");
24+
let state_name = format_ident!("{name}InstanceState");
2525

2626
if !input.generics.params.is_empty() {
2727
return Err(Error::new_spanned(
@@ -63,50 +63,53 @@ fn expand_factors(input: &DeriveInput) -> syn::Result<TokenStream> {
6363
impl #name {
6464
pub fn init(
6565
&mut self,
66-
linker: &mut #wasmtime::component::Linker<#data_name>
66+
linker: &mut #wasmtime::component::Linker<#state_name>
6767
) -> #Result<()> {
6868
#(
69-
self.#factor_names.init(
69+
#Factor::init::<Self>(
70+
&mut self.#factor_names,
7071
#factors_path::InitContext::<Self, #factor_types>::new(
7172
linker,
72-
|data| &mut data.#factor_names,
73+
|state| &mut state.#factor_names,
7374
)
7475
)?;
7576
)*
7677
Ok(())
7778
}
7879

80+
#[allow(dead_code)]
7981
pub fn module_init(
8082
&mut self,
81-
linker: &mut #wasmtime::Linker<#data_name>
83+
linker: &mut #wasmtime::Linker<#state_name>
8284
) -> #Result<()> {
8385
#(
84-
self.#factor_names.module_init::<Self>(
86+
#Factor::module_init::<Self>(
87+
&mut self.#factor_names,
8588
#factors_path::ModuleInitContext::<Self, #factor_types>::new(
8689
linker,
87-
|data| &mut data.#factor_names,
90+
|state| &mut state.#factor_names,
8891
)
8992
)?;
9093
)*
9194
Ok(())
9295
}
9396

94-
pub fn build_data(&self) -> #Result<#data_name> {
95-
let mut builders = #builders_name {
97+
pub fn build_store_data(&self) -> #Result<#state_name> {
98+
let mut preparers = #preparers_name {
9699
#( #factor_names: None, )*
97100
};
98101
#(
99-
builders.#factor_names = Some(
100-
#factors_path::FactorBuilder::<#factor_types>::prepare::<#name>(
102+
preparers.#factor_names = Some(
103+
#factors_path::InstancePreparer::<#factor_types>::new::<#name>(
101104
&self.#factor_names,
102-
#factors_path::PrepareContext::new(&mut builders),
105+
#factors_path::PrepareContext::new(&mut preparers),
103106
)?
104107
);
105108
)*
106-
Ok(#data_name {
109+
Ok(#state_name {
107110
#(
108-
#factor_names: #factors_path::FactorBuilder::<#factor_types>::build(
109-
builders.#factor_names.unwrap()
111+
#factor_names: #factors_path::InstancePreparer::<#factor_types>::prepare(
112+
preparers.#factor_names.unwrap()
110113
)?,
111114
)*
112115
})
@@ -115,20 +118,20 @@ fn expand_factors(input: &DeriveInput) -> syn::Result<TokenStream> {
115118
}
116119

117120
impl #factors_path::SpinFactors for #name {
118-
type Builders = #builders_name;
119-
type InstanceState = #data_name;
121+
type InstancePreparers = #preparers_name;
122+
type InstanceState = #state_name;
120123

121-
unsafe fn factor_builder_offset<T: #Factor>() -> Option<usize> {
124+
unsafe fn instance_preparer_offset<T: #Factor>() -> Option<usize> {
122125
let type_id = #TypeId::of::<T>();
123126
#(
124127
if type_id == #TypeId::of::<#factor_types>() {
125-
return Some(std::mem::offset_of!(Self::Builders, #factor_names));
128+
return Some(std::mem::offset_of!(Self::InstancePreparers, #factor_names));
126129
}
127130
)*
128131
None
129132
}
130133

131-
unsafe fn factor_data_offset<T: #Factor>() -> Option<usize> {
134+
unsafe fn instance_state_offset<T: #Factor>() -> Option<usize> {
132135
let type_id = #TypeId::of::<T>();
133136
#(
134137
if type_id == #TypeId::of::<#factor_types>() {
@@ -140,13 +143,13 @@ fn expand_factors(input: &DeriveInput) -> syn::Result<TokenStream> {
140143
}
141144
}
142145

143-
#vis struct #builders_name {
146+
#vis struct #preparers_name {
144147
#(
145-
pub #factor_names: Option<<#factor_types as #Factor>::Builder>,
148+
pub #factor_names: Option<<#factor_types as #Factor>::InstancePreparer>,
146149
)*
147150
}
148151

149-
#vis struct #data_name {
152+
#vis struct #state_name {
150153
#(
151154
pub #factor_names: <#factor_types as #Factor>::InstanceState,
152155
)*

crates/factors/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ wasmtime = { workspace = true }
1212

1313
[dev-dependencies]
1414
spin-factors-derive = { path = "../factors-derive", features = ["expander"] }
15+
spin-factor-wasi = { path = "../factor-wasi" }
1516

1617
[lints]
1718
workspace = true

crates/factors/src/lib.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub type Linker<Factors> = wasmtime::component::Linker<<Factors as SpinFactors>:
1212
pub type ModuleLinker<Factors> = wasmtime::Linker<<Factors as SpinFactors>::InstanceState>;
1313

1414
pub trait Factor: Any + Sized {
15-
type InstancePreparer: FactorInstancePreparer<Self>;
15+
type InstancePreparer: InstancePreparer<Self>;
1616
type InstanceState;
1717

1818
/// Initializes this Factor for a runtime. This will be called exactly once
@@ -71,45 +71,45 @@ where {
7171
}
7272

7373
impl<'a, Factors: SpinFactors> PrepareContext<'a, Factors> {
74-
pub fn builder_mut<T: Factor>(&mut self) -> Result<&mut T::InstancePreparer> {
75-
let err_msg = match Factors::builder_mut::<T>(self.builders) {
76-
Some(Some(builder)) => return Ok(builder),
77-
Some(None) => "builder not yet prepared",
74+
pub fn instance_preparer_mut<T: Factor>(&mut self) -> Result<&mut T::InstancePreparer> {
75+
let err_msg = match Factors::instance_preparer_mut::<T>(self.instance_preparers) {
76+
Some(Some(preparer)) => return Ok(preparer),
77+
Some(None) => "preparer not yet initialized",
7878
None => "no such factor",
7979
};
8080
Err(Error::msg(format!(
81-
"could not get builder for {ty}: {err_msg}",
81+
"could not get instance preparer for {ty}: {err_msg}",
8282
ty = std::any::type_name::<T>()
8383
)))
8484
}
8585
}
8686

8787
/// Implemented by `#[derive(SpinFactors)]`
8888
pub trait SpinFactors: Sized {
89-
type Builders;
89+
type InstancePreparers;
9090
type InstanceState: Send + 'static;
9191

9292
#[doc(hidden)]
93-
unsafe fn factor_builder_offset<T: Factor>() -> Option<usize>;
93+
unsafe fn instance_preparer_offset<T: Factor>() -> Option<usize>;
9494

9595
#[doc(hidden)]
96-
unsafe fn factor_data_offset<T: Factor>() -> Option<usize>;
96+
unsafe fn instance_state_offset<T: Factor>() -> Option<usize>;
9797

98-
fn data_getter<T: Factor>() -> Option<Getter<Self::InstanceState, T::InstanceState>> {
99-
let offset = unsafe { Self::factor_data_offset::<T>()? };
98+
fn instance_state_getter<T: Factor>() -> Option<Getter<Self::InstanceState, T::InstanceState>> {
99+
let offset = unsafe { Self::instance_state_offset::<T>()? };
100100
Some(Getter {
101101
offset,
102102
_phantom: PhantomData,
103103
})
104104
}
105105

106-
fn data_getter2<T1: Factor, T2: Factor>(
106+
fn instance_state_getter2<T1: Factor, T2: Factor>(
107107
) -> Option<Getter2<Self::InstanceState, T1::InstanceState, T2::InstanceState>> {
108-
let offset1 = unsafe { Self::factor_data_offset::<T1>()? };
109-
let offset2 = unsafe { Self::factor_data_offset::<T2>()? };
108+
let offset1 = unsafe { Self::instance_state_offset::<T1>()? };
109+
let offset2 = unsafe { Self::instance_state_offset::<T2>()? };
110110
assert_ne!(
111111
offset1, offset2,
112-
"data_getter2 with same factor twice would alias"
112+
"instance_state_getter2 with same factor twice would alias"
113113
);
114114
Some(Getter2 {
115115
offset1,
@@ -118,12 +118,12 @@ pub trait SpinFactors: Sized {
118118
})
119119
}
120120

121-
fn builder_mut<T: Factor>(
122-
builders: &mut Self::Builders,
121+
fn instance_preparer_mut<T: Factor>(
122+
preparers: &mut Self::InstancePreparers,
123123
) -> Option<Option<&mut T::InstancePreparer>> {
124124
unsafe {
125-
let offset = Self::factor_builder_offset::<T>()?;
126-
let ptr = builders as *mut Self::Builders;
125+
let offset = Self::instance_preparer_offset::<T>()?;
126+
let ptr = preparers as *mut Self::InstancePreparers;
127127
let opt = &mut *ptr.add(offset).cast::<Option<T::InstancePreparer>>();
128128
Some(opt.as_mut())
129129
}
@@ -180,27 +180,27 @@ impl<T, U, V> Clone for Getter2<T, U, V> {
180180
}
181181
impl<T, U, V> Copy for Getter2<T, U, V> {}
182182

183-
pub trait FactorInstancePreparer<T: Factor>: Sized {
183+
pub trait InstancePreparer<T: Factor>: Sized {
184184
fn new<Factors: SpinFactors>(_factor: &T, _ctx: PrepareContext<Factors>) -> Result<Self>;
185185

186186
fn prepare(self) -> Result<T::InstanceState>;
187187
}
188188

189189
pub struct PrepareContext<'a, Factors: SpinFactors> {
190-
builders: &'a mut Factors::Builders,
190+
instance_preparers: &'a mut Factors::InstancePreparers,
191191
// TODO: component: &'a AppComponent,
192192
}
193193

194194
impl<'a, Factors: SpinFactors> PrepareContext<'a, Factors> {
195195
#[doc(hidden)]
196-
pub fn new(builders: &'a mut Factors::Builders) -> Self {
197-
Self { builders }
196+
pub fn new(instance_preparers: &'a mut Factors::InstancePreparers) -> Self {
197+
Self { instance_preparers }
198198
}
199199
}
200200

201-
pub type DefaultBuilder = ();
201+
pub type DefaultInstancePreparer = ();
202202

203-
impl<T: Factor> FactorInstancePreparer<T> for DefaultBuilder
203+
impl<T: Factor> InstancePreparer<T> for DefaultInstancePreparer
204204
where
205205
T::InstanceState: Default,
206206
{

crates/factors/tests/smoke.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1+
use spin_factor_wasi::WasiFactor;
12
use spin_factors::SpinFactors;
23

34
#[derive(SpinFactors)]
4-
struct Factors {}
5+
struct Factors {
6+
wasi: WasiFactor,
7+
}
58

69
fn main() -> anyhow::Result<()> {
7-
let mut factors = Factors {};
8-
910
let engine = wasmtime::Engine::default();
1011
let mut linker = wasmtime::component::Linker::new(&engine);
11-
factors.init(&mut linker).unwrap();
1212

13-
let factors = Factors {
14-
// wasi: WasiFactor,
13+
let mut factors = Factors {
14+
wasi: WasiFactor,
1515
// outbound_networking_factor: OutboundNetworkingFactor,
1616
// outbound_http_factor: OutboundHttpFactor,
1717
};
18-
let data = factors.build_data().unwrap();
18+
factors.init(&mut linker).unwrap();
19+
let data = factors.build_store_data().unwrap();
1920

2021
let mut store = wasmtime::Store::new(&engine, data);
2122
let component = wasmtime::component::Component::new(&engine, b"(component)").unwrap();

0 commit comments

Comments
 (0)