Skip to content

Commit 7396a78

Browse files
authored
Merge pull request #1958 from fermyon/final-wit-changes
Potentially final wit changes for 2.0.0
2 parents fe20501 + 0873a64 commit 7396a78

File tree

32 files changed

+406
-94
lines changed

32 files changed

+406
-94
lines changed

crates/outbound-mysql/src/lib.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ use mysql_async::{consts::ColumnType, from_value_opt, prelude::*, Opts, OptsBuil
33
use spin_core::wasmtime::component::Resource;
44
use spin_core::{async_trait, HostComponent};
55
use spin_world::v1::mysql as v1;
6-
use spin_world::v1::rdbms_types::{Column, DbDataType, DbValue, ParameterValue, RowSet};
76
use spin_world::v2::mysql::{self as v2, Connection};
7+
use spin_world::v2::rdbms_types as v2_types;
8+
use spin_world::v2::rdbms_types::{Column, DbDataType, DbValue, ParameterValue};
89
use std::sync::Arc;
910
use url::Url;
1011

@@ -85,7 +86,7 @@ impl v2::HostConnection for OutboundMysql {
8586
connection: Resource<Connection>,
8687
statement: String,
8788
params: Vec<ParameterValue>,
88-
) -> Result<Result<RowSet, v2::Error>> {
89+
) -> Result<Result<v2_types::RowSet, v2::Error>> {
8990
Ok(async {
9091
let db_params = params.into_iter().map(to_sql_parameter).collect::<Vec<_>>();
9192
let parameters = mysql_async::Params::Positional(db_params);
@@ -108,7 +109,7 @@ impl v2::HostConnection for OutboundMysql {
108109
.map(|row| convert_row(row, &columns))
109110
.collect::<Result<Vec<_>, _>>()?;
110111

111-
Ok(RowSet { columns, rows })
112+
Ok(v2_types::RowSet { columns, rows })
112113
}
113114
}
114115
}
@@ -126,11 +127,11 @@ macro_rules! delegate {
126127
($self:ident.$name:ident($address:expr, $($arg:expr),*)) => {{
127128
let connection = match <Self as v2::HostConnection>::open($self, $address).await? {
128129
Ok(c) => c,
129-
Err(e) => return Ok(Err(to_legacy_error(e))),
130+
Err(e) => return Ok(Err(e.into())),
130131
};
131132
Ok(<Self as v2::HostConnection>::$name($self, connection, $($arg),*)
132133
.await?
133-
.map_err(|e| to_legacy_error(e)))
134+
.map_err(Into::into))
134135
}};
135136
}
136137

@@ -140,28 +141,27 @@ impl v1::Host for OutboundMysql {
140141
&mut self,
141142
address: String,
142143
statement: String,
143-
params: Vec<ParameterValue>,
144+
params: Vec<v1::ParameterValue>,
144145
) -> Result<Result<(), v1::MysqlError>> {
145-
delegate!(self.execute(address, statement, params))
146+
delegate!(self.execute(
147+
address,
148+
statement,
149+
params.into_iter().map(Into::into).collect()
150+
))
146151
}
147152

148153
async fn query(
149154
&mut self,
150155
address: String,
151156
statement: String,
152-
params: Vec<ParameterValue>,
153-
) -> Result<Result<RowSet, v1::MysqlError>> {
154-
delegate!(self.query(address, statement, params))
155-
}
156-
}
157-
158-
fn to_legacy_error(error: v2::Error) -> v1::MysqlError {
159-
match error {
160-
v2::Error::ConnectionFailed(e) => v1::MysqlError::ConnectionFailed(e),
161-
v2::Error::BadParameter(e) => v1::MysqlError::BadParameter(e),
162-
v2::Error::QueryFailed(e) => v1::MysqlError::QueryFailed(e),
163-
v2::Error::ValueConversionFailed(e) => v1::MysqlError::ValueConversionFailed(e),
164-
v2::Error::Other(e) => v1::MysqlError::OtherError(e),
157+
params: Vec<v1::ParameterValue>,
158+
) -> Result<Result<v1::RowSet, v1::MysqlError>> {
159+
delegate!(self.query(
160+
address,
161+
statement,
162+
params.into_iter().map(Into::into).collect()
163+
))
164+
.map(|r| r.map(Into::into))
165165
}
166166
}
167167

crates/outbound-pg/src/lib.rs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ use anyhow::{anyhow, Result};
22
use native_tls::TlsConnector;
33
use postgres_native_tls::MakeTlsConnector;
44
use spin_core::{async_trait, wasmtime::component::Resource, HostComponent};
5-
use spin_world::v1::{
6-
postgres as v1,
7-
rdbms_types::{Column, DbDataType, DbValue, ParameterValue, RowSet},
8-
};
5+
use spin_world::v1::postgres as v1;
6+
use spin_world::v1::rdbms_types as v1_types;
97
use spin_world::v2::postgres::{self as v2, Connection};
8+
use spin_world::v2::rdbms_types::{Column, DbDataType, DbValue, ParameterValue, RowSet};
109
use tokio_postgres::{
1110
config::SslMode,
1211
types::{ToSql, Type},
@@ -350,11 +349,11 @@ macro_rules! delegate {
350349
($self:ident.$name:ident($address:expr, $($arg:expr),*)) => {{
351350
let connection = match <Self as v2::HostConnection>::open($self, $address).await? {
352351
Ok(c) => c,
353-
Err(e) => return Ok(Err(to_legacy_error(e))),
352+
Err(e) => return Ok(Err(e.into())),
354353
};
355354
Ok(<Self as v2::HostConnection>::$name($self, connection, $($arg),*)
356355
.await?
357-
.map_err(|e| to_legacy_error(e)))
356+
.map_err(|e| e.into()))
358357
}};
359358
}
360359

@@ -364,27 +363,26 @@ impl v1::Host for OutboundPg {
364363
&mut self,
365364
address: String,
366365
statement: String,
367-
params: Vec<ParameterValue>,
366+
params: Vec<v1_types::ParameterValue>,
368367
) -> Result<Result<u64, v1::PgError>> {
369-
delegate!(self.execute(address, statement, params))
368+
delegate!(self.execute(
369+
address,
370+
statement,
371+
params.into_iter().map(Into::into).collect()
372+
))
370373
}
371374

372375
async fn query(
373376
&mut self,
374377
address: String,
375378
statement: String,
376-
params: Vec<ParameterValue>,
377-
) -> Result<Result<RowSet, v1::PgError>> {
378-
delegate!(self.query(address, statement, params))
379-
}
380-
}
381-
382-
fn to_legacy_error(error: v2::Error) -> v1::PgError {
383-
match error {
384-
v2::Error::ConnectionFailed(e) => v1::PgError::ConnectionFailed(e),
385-
v2::Error::BadParameter(e) => v1::PgError::BadParameter(e),
386-
v2::Error::QueryFailed(e) => v1::PgError::QueryFailed(e),
387-
v2::Error::ValueConversionFailed(e) => v1::PgError::ValueConversionFailed(e),
388-
v2::Error::Other(e) => v1::PgError::OtherError(e),
379+
params: Vec<v1_types::ParameterValue>,
380+
) -> Result<Result<v1_types::RowSet, v1::PgError>> {
381+
delegate!(self.query(
382+
address,
383+
statement,
384+
params.into_iter().map(Into::into).collect()
385+
))
386+
.map(|r| r.map(Into::into))
389387
}
390388
}

crates/outbound-redis/src/lib.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ use anyhow::Result;
44
use redis::{aio::Connection, AsyncCommands, FromRedisValue, Value};
55
use spin_core::{async_trait, wasmtime::component::Resource};
66
use spin_locked_app::MetadataKey;
7-
use spin_world::v1::redis::{self as v1, RedisParameter, RedisResult};
8-
use spin_world::v2::redis::{self as v2, Connection as RedisConnection, Error};
7+
use spin_world::v1::redis as v1;
8+
use spin_world::v2::redis::{
9+
self as v2, Connection as RedisConnection, Error, RedisParameter, RedisResult,
10+
};
911

1012
pub const ALLOWED_HOSTS_KEY: MetadataKey<Option<Vec<String>>> =
1113
MetadataKey::new("allowed_outbound_hosts");
@@ -332,9 +334,14 @@ impl v1::Host for OutboundRedis {
332334
&mut self,
333335
address: String,
334336
command: String,
335-
arguments: Vec<RedisParameter>,
336-
) -> Result<Result<Vec<RedisResult>, v1::Error>> {
337-
delegate!(self.execute(address, command, arguments))
337+
arguments: Vec<v1::RedisParameter>,
338+
) -> Result<Result<Vec<v1::RedisResult>, v1::Error>> {
339+
delegate!(self.execute(
340+
address,
341+
command,
342+
arguments.into_iter().map(Into::into).collect()
343+
))
344+
.map(|r| r.map(|v| v.into_iter().map(Into::into).collect()))
338345
}
339346
}
340347

crates/redis/tests/rust/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::str::{from_utf8, Utf8Error};
22

33
wit_bindgen::generate!({
44
world: "redis-trigger",
5-
path: "../../../../wit/preview2",
5+
path: "../../../../wit/preview2/deps/spin@unversioned",
66
exports: {
77
"fermyon:spin/inbound-redis": SpinRedis,
88
}

crates/trigger-http/benches/spin-http-benchmark/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
wit_bindgen::generate!({
22
world: "http-trigger",
3-
path: "../../../../wit/preview2",
3+
path: "../../../../wit/preview2/deps/spin@unversioned",
44
exports: {
55
"fermyon:spin/inbound-http": SpinHttp,
66
}

crates/trigger-http/tests/rust-http-test/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
wit_bindgen::generate!({
22
world: "http-trigger",
3-
path: "../../../../wit/preview2",
3+
path: "../../../../wit/preview2/deps/spin@unversioned",
44
exports: {
55
"fermyon:spin/inbound-http": SpinHttp,
66
}

crates/world/src/conversions.rs

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
use super::*;
2+
3+
mod rdbms_types {
4+
use super::*;
5+
6+
impl From<v2::rdbms_types::Column> for v1::rdbms_types::Column {
7+
fn from(value: v2::rdbms_types::Column) -> Self {
8+
v1::rdbms_types::Column {
9+
name: value.name,
10+
data_type: value.data_type.into(),
11+
}
12+
}
13+
}
14+
15+
impl From<v2::rdbms_types::DbValue> for v1::rdbms_types::DbValue {
16+
fn from(value: v2::rdbms_types::DbValue) -> v1::rdbms_types::DbValue {
17+
match value {
18+
v2::rdbms_types::DbValue::Boolean(b) => v1::rdbms_types::DbValue::Boolean(b),
19+
v2::rdbms_types::DbValue::Int8(i) => v1::rdbms_types::DbValue::Int8(i),
20+
v2::rdbms_types::DbValue::Int16(i) => v1::rdbms_types::DbValue::Int16(i),
21+
v2::rdbms_types::DbValue::Int32(i) => v1::rdbms_types::DbValue::Int32(i),
22+
v2::rdbms_types::DbValue::Int64(i) => v1::rdbms_types::DbValue::Int64(i),
23+
v2::rdbms_types::DbValue::Uint8(j) => v1::rdbms_types::DbValue::Uint8(j),
24+
v2::rdbms_types::DbValue::Uint16(u) => v1::rdbms_types::DbValue::Uint16(u),
25+
v2::rdbms_types::DbValue::Uint32(u) => v1::rdbms_types::DbValue::Uint32(u),
26+
v2::rdbms_types::DbValue::Uint64(u) => v1::rdbms_types::DbValue::Uint64(u),
27+
v2::rdbms_types::DbValue::Floating32(r) => v1::rdbms_types::DbValue::Floating32(r),
28+
v2::rdbms_types::DbValue::Floating64(r) => v1::rdbms_types::DbValue::Floating64(r),
29+
v2::rdbms_types::DbValue::Str(s) => v1::rdbms_types::DbValue::Str(s),
30+
v2::rdbms_types::DbValue::Binary(b) => v1::rdbms_types::DbValue::Binary(b),
31+
v2::rdbms_types::DbValue::DbNull => v1::rdbms_types::DbValue::DbNull,
32+
v2::rdbms_types::DbValue::Unsupported => v1::rdbms_types::DbValue::Unsupported,
33+
}
34+
}
35+
}
36+
37+
impl From<v2::rdbms_types::DbDataType> for v1::rdbms_types::DbDataType {
38+
fn from(value: v2::rdbms_types::DbDataType) -> v1::rdbms_types::DbDataType {
39+
match value {
40+
v2::rdbms_types::DbDataType::Boolean => v1::rdbms_types::DbDataType::Boolean,
41+
v2::rdbms_types::DbDataType::Int8 => v1::rdbms_types::DbDataType::Int8,
42+
v2::rdbms_types::DbDataType::Int16 => v1::rdbms_types::DbDataType::Int16,
43+
v2::rdbms_types::DbDataType::Int32 => v1::rdbms_types::DbDataType::Int32,
44+
v2::rdbms_types::DbDataType::Int64 => v1::rdbms_types::DbDataType::Int64,
45+
v2::rdbms_types::DbDataType::Uint8 => v1::rdbms_types::DbDataType::Uint8,
46+
v2::rdbms_types::DbDataType::Uint16 => v1::rdbms_types::DbDataType::Uint16,
47+
v2::rdbms_types::DbDataType::Uint32 => v1::rdbms_types::DbDataType::Uint32,
48+
v2::rdbms_types::DbDataType::Uint64 => v1::rdbms_types::DbDataType::Uint64,
49+
v2::rdbms_types::DbDataType::Floating32 => v1::rdbms_types::DbDataType::Floating32,
50+
v2::rdbms_types::DbDataType::Floating64 => v1::rdbms_types::DbDataType::Floating64,
51+
v2::rdbms_types::DbDataType::Str => v1::rdbms_types::DbDataType::Str,
52+
v2::rdbms_types::DbDataType::Binary => v1::rdbms_types::DbDataType::Binary,
53+
v2::rdbms_types::DbDataType::Other => v1::rdbms_types::DbDataType::Other,
54+
}
55+
}
56+
}
57+
58+
impl From<v1::rdbms_types::ParameterValue> for v2::rdbms_types::ParameterValue {
59+
fn from(value: v1::rdbms_types::ParameterValue) -> v2::rdbms_types::ParameterValue {
60+
match value {
61+
v1::rdbms_types::ParameterValue::Boolean(b) => {
62+
v2::rdbms_types::ParameterValue::Boolean(b)
63+
}
64+
v1::rdbms_types::ParameterValue::Int8(i) => {
65+
v2::rdbms_types::ParameterValue::Int8(i)
66+
}
67+
v1::rdbms_types::ParameterValue::Int16(i) => {
68+
v2::rdbms_types::ParameterValue::Int16(i)
69+
}
70+
v1::rdbms_types::ParameterValue::Int32(i) => {
71+
v2::rdbms_types::ParameterValue::Int32(i)
72+
}
73+
v1::rdbms_types::ParameterValue::Int64(i) => {
74+
v2::rdbms_types::ParameterValue::Int64(i)
75+
}
76+
v1::rdbms_types::ParameterValue::Uint8(u) => {
77+
v2::rdbms_types::ParameterValue::Uint8(u)
78+
}
79+
v1::rdbms_types::ParameterValue::Uint16(u) => {
80+
v2::rdbms_types::ParameterValue::Uint16(u)
81+
}
82+
v1::rdbms_types::ParameterValue::Uint32(u) => {
83+
v2::rdbms_types::ParameterValue::Uint32(u)
84+
}
85+
v1::rdbms_types::ParameterValue::Uint64(u) => {
86+
v2::rdbms_types::ParameterValue::Uint64(u)
87+
}
88+
v1::rdbms_types::ParameterValue::Floating32(r) => {
89+
v2::rdbms_types::ParameterValue::Floating32(r)
90+
}
91+
v1::rdbms_types::ParameterValue::Floating64(r) => {
92+
v2::rdbms_types::ParameterValue::Floating64(r)
93+
}
94+
v1::rdbms_types::ParameterValue::Str(s) => v2::rdbms_types::ParameterValue::Str(s),
95+
v1::rdbms_types::ParameterValue::Binary(b) => {
96+
v2::rdbms_types::ParameterValue::Binary(b)
97+
}
98+
v1::rdbms_types::ParameterValue::DbNull => v2::rdbms_types::ParameterValue::DbNull,
99+
}
100+
}
101+
}
102+
103+
impl From<v2::rdbms_types::Error> for v1::mysql::MysqlError {
104+
fn from(error: v2::rdbms_types::Error) -> v1::mysql::MysqlError {
105+
match error {
106+
v2::mysql::Error::ConnectionFailed(e) => v1::mysql::MysqlError::ConnectionFailed(e),
107+
v2::mysql::Error::BadParameter(e) => v1::mysql::MysqlError::BadParameter(e),
108+
v2::mysql::Error::QueryFailed(e) => v1::mysql::MysqlError::QueryFailed(e),
109+
v2::mysql::Error::ValueConversionFailed(e) => {
110+
v1::mysql::MysqlError::ValueConversionFailed(e)
111+
}
112+
v2::mysql::Error::Other(e) => v1::mysql::MysqlError::OtherError(e),
113+
}
114+
}
115+
}
116+
117+
impl From<v2::rdbms_types::Error> for v1::postgres::PgError {
118+
fn from(error: v2::rdbms_types::Error) -> v1::postgres::PgError {
119+
match error {
120+
v2::mysql::Error::ConnectionFailed(e) => v1::postgres::PgError::ConnectionFailed(e),
121+
v2::mysql::Error::BadParameter(e) => v1::postgres::PgError::BadParameter(e),
122+
v2::mysql::Error::QueryFailed(e) => v1::postgres::PgError::QueryFailed(e),
123+
v2::mysql::Error::ValueConversionFailed(e) => {
124+
v1::postgres::PgError::ValueConversionFailed(e)
125+
}
126+
v2::mysql::Error::Other(e) => v1::postgres::PgError::OtherError(e),
127+
}
128+
}
129+
}
130+
}
131+
132+
mod mysql {
133+
use super::*;
134+
impl From<v2::mysql::RowSet> for v1::mysql::RowSet {
135+
fn from(value: v2::mysql::RowSet) -> v1::mysql::RowSet {
136+
v1::mysql::RowSet {
137+
columns: value.columns.into_iter().map(Into::into).collect(),
138+
rows: value
139+
.rows
140+
.into_iter()
141+
.map(|r| r.into_iter().map(Into::into).collect())
142+
.collect(),
143+
}
144+
}
145+
}
146+
}
147+
148+
mod redis {
149+
use super::*;
150+
151+
impl From<v1::redis::RedisParameter> for v2::redis::RedisParameter {
152+
fn from(value: v1::redis::RedisParameter) -> Self {
153+
match value {
154+
v1::redis::RedisParameter::Int64(i) => v2::redis::RedisParameter::Int64(i),
155+
v1::redis::RedisParameter::Binary(b) => v2::redis::RedisParameter::Binary(b),
156+
}
157+
}
158+
}
159+
160+
impl From<v2::redis::RedisResult> for v1::redis::RedisResult {
161+
fn from(value: v2::redis::RedisResult) -> Self {
162+
match value {
163+
v2::redis::RedisResult::Nil => v1::redis::RedisResult::Nil,
164+
v2::redis::RedisResult::Status(s) => v1::redis::RedisResult::Status(s),
165+
v2::redis::RedisResult::Int64(i) => v1::redis::RedisResult::Int64(i),
166+
v2::redis::RedisResult::Binary(b) => v1::redis::RedisResult::Binary(b),
167+
}
168+
}
169+
}
170+
}

crates/world/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ wasmtime::component::bindgen!({
88

99
pub use fermyon::spin as v1;
1010
pub use fermyon::spin2_0_0 as v2;
11+
12+
mod conversions;

0 commit comments

Comments
 (0)