Skip to content

Commit c225bee

Browse files
committed
Copy spin-core and spin-app crates from prototype
Signed-off-by: Lann Martin <lann.martin@fermyon.com>
1 parent ca36ce8 commit c225bee

File tree

13 files changed

+1226
-0
lines changed

13 files changed

+1226
-0
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,10 @@ e2e-tests = []
6969

7070
[workspace]
7171
members = [
72+
"crates/app",
7273
"crates/build",
7374
"crates/config",
75+
"crates/core",
7476
"crates/engine",
7577
"crates/http",
7678
"crates/loader",

crates/app/Cargo.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[package]
2+
name = "spin-app"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
anyhow = "1.0"
8+
async-trait = "0.1"
9+
ouroboros = "0.15"
10+
serde = { version = "1.0", features = ["derive"] }
11+
serde_json = "1.0"
12+
spin-core = { path = "../core" }
13+
thiserror = "1.0"

crates/app/src/host_component.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use std::sync::Arc;
2+
3+
use spin_core::{EngineBuilder, HostComponent, HostComponentsData};
4+
5+
use crate::AppComponent;
6+
7+
pub trait DynamicHostComponent: HostComponent {
8+
fn update_data(&self, data: &mut Self::Data, component: &AppComponent) -> anyhow::Result<()>;
9+
}
10+
11+
impl<DHC: DynamicHostComponent> DynamicHostComponent for Arc<DHC> {
12+
fn update_data(&self, data: &mut Self::Data, component: &AppComponent) -> anyhow::Result<()> {
13+
(**self).update_data(data, component)
14+
}
15+
}
16+
17+
type DataUpdater =
18+
Box<dyn Fn(&mut HostComponentsData, &AppComponent) -> anyhow::Result<()> + Send + Sync>;
19+
20+
#[derive(Default)]
21+
pub struct DynamicHostComponents {
22+
data_updaters: Vec<DataUpdater>,
23+
}
24+
25+
impl DynamicHostComponents {
26+
pub fn add_dynamic_host_component<T: Send + Sync, DHC: DynamicHostComponent>(
27+
&mut self,
28+
engine_builder: &mut EngineBuilder<T>,
29+
host_component: DHC,
30+
) -> anyhow::Result<()> {
31+
let host_component = Arc::new(host_component);
32+
let handle = engine_builder.add_host_component(host_component.clone())?;
33+
self.data_updaters
34+
.push(Box::new(move |host_components_data, component| {
35+
let data = host_components_data.get_or_insert(handle);
36+
host_component.update_data(data, component)
37+
}));
38+
Ok(())
39+
}
40+
41+
pub fn update_data(
42+
&self,
43+
host_components_data: &mut HostComponentsData,
44+
component: &AppComponent,
45+
) -> anyhow::Result<()> {
46+
for data_updater in &self.data_updaters {
47+
data_updater(host_components_data, component)?;
48+
}
49+
Ok(())
50+
}
51+
}

0 commit comments

Comments
 (0)