Skip to content

Commit 35840cb

Browse files
committed
Move the rest of the components over to use the helper
Signed-off-by: Ryan Levick <ryan.levick@fermyon.com>
1 parent 1d7a78e commit 35840cb

File tree

18 files changed

+107
-206
lines changed

18 files changed

+107
-206
lines changed

Cargo.lock

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ resolver = "2"
1717

1818
[workspace.dependencies]
1919
anyhow = "1.0"
20+
helper = { path = "crates/helper" }
2021
wit-bindgen = "0.26"

components/key-value/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ crate-type = ["cdylib"]
88

99
[dependencies]
1010
anyhow = { workspace = true }
11-
helper = { path = "../../crates/helper" }
11+
helper = { workspace = true }
1212
wit-bindgen = { workspace = true }

components/key-value/src/lib.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@ struct Component;
44

55
helper::gen_http_trigger_bindings!(Component);
66

7-
use bindings::{
8-
exports::wasi::http0_2_0::incoming_handler::Guest,
7+
use helper::bindings::{
98
fermyon::spin2_0_0::key_value::{Error, Store},
10-
};
11-
use helper::bindings::wasi::http0_2_0::types::{
12-
IncomingRequest, OutgoingResponse, ResponseOutparam,
9+
wasi::http0_2_0::types::{IncomingRequest, OutgoingResponse, ResponseOutparam},
1310
};
1411

15-
impl Guest for Component {
12+
impl bindings::Guest for Component {
1613
fn handle(request: IncomingRequest, response_out: ResponseOutparam) {
1714
helper::handle_result(handle(request), response_out);
1815
}

components/outbound-redis/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ crate-type = ["cdylib"]
88

99
[dependencies]
1010
anyhow = { workspace = true }
11-
helper = { path = "../../crates/helper" }
11+
helper = { workspace = true }
1212
wit-bindgen = { workspace = true }

components/outbound-redis/src/lib.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ use anyhow::Context as _;
33
struct Component;
44

55
helper::gen_http_trigger_bindings!(Component);
6-
use bindings::{exports::wasi::http0_2_0::incoming_handler::Guest, fermyon::spin2_0_0::redis};
7-
use helper::bindings::wasi::http0_2_0::types::{
8-
IncomingRequest, OutgoingResponse, ResponseOutparam,
6+
7+
use helper::bindings::{
8+
fermyon::spin2_0_0::redis,
9+
wasi::http0_2_0::types::{IncomingRequest, OutgoingResponse, ResponseOutparam},
910
};
1011

11-
impl Guest for Component {
12+
impl bindings::Guest for Component {
1213
fn handle(request: IncomingRequest, response_out: ResponseOutparam) {
1314
helper::handle_result(handle(request), response_out);
1415
}

components/outbound-wasi-http-v0.2.0/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ edition = "2021"
77
crate-type = ["cdylib"]
88

99
[dependencies]
10+
anyhow = { workspace = true }
11+
helper = { workspace = true }
1012
url = "2.4.0"
1113
wit-bindgen = { workspace = true }

components/outbound-wasi-http-v0.2.0/src/lib.rs

+11-34
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,16 @@
1-
wit_bindgen::generate!({
2-
path: "../../wit",
3-
world: "wasi:http/proxy@0.2.0",
4-
});
5-
6-
use exports::wasi::http0_2_0::incoming_handler;
7-
use url::Url;
8-
use wasi::{
9-
http0_2_0::{
10-
outgoing_handler,
11-
types::{
12-
Headers, IncomingRequest, Method, OutgoingBody, OutgoingRequest, OutgoingResponse,
13-
ResponseOutparam, Scheme,
14-
},
15-
},
16-
io0_2_0::streams::StreamError,
1+
use helper::bindings::wasi::http0_2_0::outgoing_handler;
2+
use helper::bindings::wasi::http0_2_0::types::{
3+
Headers, IncomingRequest, Method, OutgoingBody, OutgoingRequest, OutgoingResponse,
4+
ResponseOutparam, Scheme,
175
};
6+
use helper::bindings::wasi::io0_2_0::streams::StreamError;
7+
use url::Url;
188

199
struct Component;
2010

21-
export!(Component);
11+
helper::gen_http_trigger_bindings!(Component);
2212

23-
impl incoming_handler::Guest for Component {
13+
impl bindings::Guest for Component {
2414
fn handle(request: IncomingRequest, outparam: ResponseOutparam) {
2515
// The request must have a "url" header.
2616
let Some(url) = request.headers().entries().iter().find_map(|(k, v)| {
@@ -30,7 +20,7 @@ impl incoming_handler::Guest for Component {
3020
.and_then(|v| Url::parse(v).ok())
3121
}) else {
3222
// Otherwise, return a 400 Bad Request response.
33-
return_response(outparam, 400, b"Bad Request");
23+
return_response(outparam, 400, b"missing header: url");
3424
return;
3525
};
3626

@@ -55,7 +45,7 @@ impl incoming_handler::Guest for Component {
5545
.unwrap();
5646

5747
// Write the request body.
58-
write_outgoing_body(outgoing_request.body().unwrap(), b"Hello, world!");
48+
helper::write_outgoing_body(outgoing_request.body().unwrap(), b"Hello, world!");
5949

6050
// Get the incoming response.
6151
let response = match outgoing_handler::handle(outgoing_request, None) {
@@ -103,20 +93,7 @@ impl incoming_handler::Guest for Component {
10393
}
10494
}
10595

106-
fn write_outgoing_body(outgoing_body: OutgoingBody, message: &[u8]) {
107-
assert!(message.len() <= 4096);
108-
{
109-
let outgoing_stream = outgoing_body.write().unwrap();
110-
outgoing_stream.blocking_write_and_flush(message).unwrap();
111-
// The outgoing stream must be dropped before the outgoing body is finished.
112-
}
113-
OutgoingBody::finish(outgoing_body, None).unwrap();
114-
}
115-
11696
fn return_response(outparam: ResponseOutparam, status: u16, body: &[u8]) {
117-
let response = OutgoingResponse::new(Headers::new());
118-
response.set_status_code(status).unwrap();
119-
write_outgoing_body(response.body().unwrap(), body);
120-
97+
let response = helper::response(status, body);
12198
ResponseOutparam::set(outparam, Ok(response));
12299
}

components/request-shape/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ edition = "2021"
99
crate-type = ["cdylib"]
1010

1111
[dependencies]
12-
wit-bindgen = { workspace = true }
1312
anyhow = { workspace = true }
13+
helper = { workspace = true }
14+
wit-bindgen = { workspace = true }

components/request-shape/src/lib.rs

+8-22
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,24 @@
1-
use anyhow::Context;
1+
use anyhow::Context as _;
22
use std::collections::HashMap;
33

4-
mod bindings {
5-
wit_bindgen::generate!({
6-
world: "http-trigger",
7-
path: "../../wit",
8-
});
9-
use super::Component;
10-
export!(Component);
11-
}
12-
13-
use bindings::{
14-
exports::wasi::http0_2_0::incoming_handler::{Guest, IncomingRequest, ResponseOutparam},
15-
wasi::http0_2_0::types::{ErrorCode, Headers, OutgoingResponse},
4+
use helper::bindings::wasi::http0_2_0::types::{
5+
IncomingRequest, Method, OutgoingResponse, ResponseOutparam, Scheme,
166
};
177

18-
use crate::bindings::wasi::http0_2_0::types::{Method, Scheme};
19-
208
pub struct Component;
9+
helper::gen_http_trigger_bindings!(Component);
2110

22-
impl Guest for Component {
11+
impl bindings::Guest for Component {
2312
fn handle(request: IncomingRequest, response_out: ResponseOutparam) {
24-
let result = handle(request)
25-
.map(|_| OutgoingResponse::new(Headers::new()))
26-
.map_err(|e| ErrorCode::InternalError(Some(e.to_string())));
27-
ResponseOutparam::set(response_out, result)
13+
helper::handle_result(handle(request), response_out);
2814
}
2915
}
3016

31-
fn handle(req: IncomingRequest) -> anyhow::Result<()> {
17+
fn handle(req: IncomingRequest) -> anyhow::Result<OutgoingResponse> {
3218
check_method(&req)?;
3319
check_url(&req)?;
3420
check_headers(&req)?;
35-
Ok(())
21+
Ok(helper::ok_response())
3622
}
3723

3824
fn check_method(req: &IncomingRequest) -> anyhow::Result<()> {

components/sqlite/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
wit-bindgen = { workspace = true }
87
anyhow = { workspace = true }
8+
helper = { workspace = true }
9+
wit-bindgen = { workspace = true }
910

1011
[lib]
1112
crate-type = ["cdylib"]

components/sqlite/src/lib.rs

+9-39
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,19 @@
1-
use bindings::{
2-
exports::wasi::http0_2_0::incoming_handler::Guest,
1+
use helper::bindings::{
32
fermyon::spin2_0_0::sqlite::{Connection, Error, Value},
4-
wasi::http0_2_0::types::{
5-
Headers, IncomingRequest, OutgoingBody, OutgoingResponse, ResponseOutparam,
6-
},
3+
wasi::http0_2_0::types::{IncomingRequest, OutgoingResponse, ResponseOutparam},
74
};
85

9-
mod bindings {
10-
wit_bindgen::generate!({
11-
world: "http-trigger",
12-
path: "../../wit",
13-
});
14-
use super::Component;
15-
export!(Component);
16-
}
17-
186
struct Component;
19-
impl Guest for Component {
20-
fn handle(request: IncomingRequest, response_out: ResponseOutparam) {
21-
let result = match handle(request) {
22-
Ok(()) => response(200, b""),
23-
Err(e) => response(500, format!("{e}").as_bytes()),
24-
};
257

26-
ResponseOutparam::set(response_out, Ok(result))
8+
helper::gen_http_trigger_bindings!(Component);
9+
10+
impl bindings::Guest for Component {
11+
fn handle(request: IncomingRequest, response_out: ResponseOutparam) {
12+
helper::handle_result(handle(request), response_out)
2713
}
2814
}
2915

30-
fn handle(_request: IncomingRequest) -> anyhow::Result<()> {
16+
fn handle(_request: IncomingRequest) -> anyhow::Result<OutgoingResponse> {
3117
anyhow::ensure!(matches!(
3218
Connection::open("forbidden"),
3319
Err(Error::AccessDenied)
@@ -61,21 +47,5 @@ fn handle(_request: IncomingRequest) -> anyhow::Result<()> {
6147
anyhow::ensure!(matches!(fetched_key, Value::Text(t) if t == "my_key"));
6248
anyhow::ensure!(matches!(fetched_value, Value::Text(t) if t == "my_value"));
6349

64-
Ok(())
65-
}
66-
67-
fn response(status: u16, body: &[u8]) -> OutgoingResponse {
68-
let response = OutgoingResponse::new(Headers::new());
69-
response.set_status_code(status).unwrap();
70-
if !body.is_empty() {
71-
assert!(body.len() <= 4096);
72-
let outgoing_body = response.body().unwrap();
73-
{
74-
let outgoing_stream = outgoing_body.write().unwrap();
75-
outgoing_stream.blocking_write_and_flush(body).unwrap();
76-
// The outgoing stream must be dropped before the outgoing body is finished.
77-
}
78-
OutgoingBody::finish(outgoing_body, None).unwrap();
79-
}
80-
response
50+
Ok(helper::ok_response())
8151
}

components/tcp-sockets/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ edition = "2021"
77
crate-type = ["cdylib"]
88

99
[dependencies]
10-
wit-bindgen = { workspace = true }
1110
anyhow = { workspace = true }
11+
helper = { workspace = true }
12+
wit-bindgen = { workspace = true }

0 commit comments

Comments
 (0)