#[allow(unused_imports)]
use async_trait::async_trait;
#[allow(unused_imports)]
use serde::{Deserialize, Serialize};
#[allow(unused_imports)]
use std::{borrow::Borrow, borrow::Cow, io::Write, string::ToString};
#[allow(unused_imports)]
use wasmbus_rpc::{
cbor::*,
common::{
deserialize, message_format, serialize, Context, Message, MessageDispatch, MessageFormat,
SendOpts, Transport,
},
error::{RpcError, RpcResult},
Timestamp,
};
#[allow(dead_code)]
pub const SMITHY_VERSION: &str = "1.0";
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct Column {
#[serde(default)]
pub ordinal: u32,
#[serde(default)]
pub name: String,
#[serde(rename = "dbType")]
#[serde(default)]
pub db_type: String,
}
#[doc(hidden)]
#[allow(unused_mut)]
pub fn encode_column<W: wasmbus_rpc::cbor::Write>(
mut e: &mut wasmbus_rpc::cbor::Encoder<W>,
val: &Column,
) -> RpcResult<()>
where
<W as wasmbus_rpc::cbor::Write>::Error: std::fmt::Display,
{
e.array(3)?;
e.u32(val.ordinal)?;
e.str(&val.name)?;
e.str(&val.db_type)?;
Ok(())
}
#[doc(hidden)]
pub fn decode_column(d: &mut wasmbus_rpc::cbor::Decoder<'_>) -> Result<Column, RpcError> {
let __result = {
let mut ordinal: Option<u32> = None;
let mut name: Option<String> = None;
let mut db_type: Option<String> = None;
let is_array = match d.datatype()? {
wasmbus_rpc::cbor::Type::Array => true,
wasmbus_rpc::cbor::Type::Map => false,
_ => {
return Err(RpcError::Deser(
"decoding struct Column, expected array or map".to_string(),
))
}
};
if is_array {
let len = d.fixed_array()?;
for __i in 0..(len as usize) {
match __i {
0 => ordinal = Some(d.u32()?),
1 => name = Some(d.str()?.to_string()),
2 => db_type = Some(d.str()?.to_string()),
_ => d.skip()?,
}
}
} else {
let len = d.fixed_map()?;
for __i in 0..(len as usize) {
match d.str()? {
"ordinal" => ordinal = Some(d.u32()?),
"name" => name = Some(d.str()?.to_string()),
"dbType" => db_type = Some(d.str()?.to_string()),
_ => d.skip()?,
}
}
}
Column {
ordinal: if let Some(__x) = ordinal {
__x
} else {
return Err(RpcError::Deser(
"missing field Column.ordinal (#0)".to_string(),
));
},
name: if let Some(__x) = name {
__x
} else {
return Err(RpcError::Deser(
"missing field Column.name (#1)".to_string(),
));
},
db_type: if let Some(__x) = db_type {
__x
} else {
return Err(RpcError::Deser(
"missing field Column.db_type (#2)".to_string(),
));
},
}
};
Ok(__result)
}
pub type Columns = Vec<Column>;
#[doc(hidden)]
#[allow(unused_mut)]
pub fn encode_columns<W: wasmbus_rpc::cbor::Write>(
mut e: &mut wasmbus_rpc::cbor::Encoder<W>,
val: &Columns,
) -> RpcResult<()>
where
<W as wasmbus_rpc::cbor::Write>::Error: std::fmt::Display,
{
e.array(val.len() as u64)?;
for item in val.iter() {
encode_column(e, item)?;
}
Ok(())
}
#[doc(hidden)]
pub fn decode_columns(d: &mut wasmbus_rpc::cbor::Decoder<'_>) -> Result<Columns, RpcError> {
let __result = {
if let Some(n) = d.array()? {
let mut arr: Vec<Column> = Vec::with_capacity(n as usize);
for _ in 0..(n as usize) {
arr.push(decode_column(d).map_err(|e| {
format!("decoding 'org.wasmcloud.interface.sqldb#Column': {}", e)
})?)
}
arr
} else {
let mut arr: Vec<Column> = Vec::new();
loop {
match d.datatype() {
Err(_) => break,
Ok(wasmbus_rpc::cbor::Type::Break) => break,
Ok(_) => arr.push(decode_column(d).map_err(|e| {
format!("decoding 'org.wasmcloud.interface.sqldb#Column': {}", e)
})?),
}
}
arr
}
};
Ok(__result)
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct ExecuteResult {
#[serde(rename = "rowsAffected")]
#[serde(default)]
pub rows_affected: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<SqlDbError>,
}
#[doc(hidden)]
#[allow(unused_mut)]
pub fn encode_execute_result<W: wasmbus_rpc::cbor::Write>(
mut e: &mut wasmbus_rpc::cbor::Encoder<W>,
val: &ExecuteResult,
) -> RpcResult<()>
where
<W as wasmbus_rpc::cbor::Write>::Error: std::fmt::Display,
{
e.array(2)?;
e.u64(val.rows_affected)?;
if let Some(val) = val.error.as_ref() {
encode_sql_db_error(e, val)?;
} else {
e.null()?;
}
Ok(())
}
#[doc(hidden)]
pub fn decode_execute_result(
d: &mut wasmbus_rpc::cbor::Decoder<'_>,
) -> Result<ExecuteResult, RpcError> {
let __result = {
let mut rows_affected: Option<u64> = None;
let mut error: Option<Option<SqlDbError>> = Some(None);
let is_array = match d.datatype()? {
wasmbus_rpc::cbor::Type::Array => true,
wasmbus_rpc::cbor::Type::Map => false,
_ => {
return Err(RpcError::Deser(
"decoding struct ExecuteResult, expected array or map".to_string(),
))
}
};
if is_array {
let len = d.fixed_array()?;
for __i in 0..(len as usize) {
match __i {
0 => rows_affected = Some(d.u64()?),
1 => {
error = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(decode_sql_db_error(d).map_err(|e| {
format!(
"decoding 'org.wasmcloud.interface.sqldb#SqlDbError': {}",
e
)
})?))
}
}
_ => d.skip()?,
}
}
} else {
let len = d.fixed_map()?;
for __i in 0..(len as usize) {
match d.str()? {
"rowsAffected" => rows_affected = Some(d.u64()?),
"error" => {
error = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(decode_sql_db_error(d).map_err(|e| {
format!(
"decoding 'org.wasmcloud.interface.sqldb#SqlDbError': {}",
e
)
})?))
}
}
_ => d.skip()?,
}
}
}
ExecuteResult {
rows_affected: if let Some(__x) = rows_affected {
__x
} else {
return Err(RpcError::Deser(
"missing field ExecuteResult.rows_affected (#0)".to_string(),
));
},
error: error.unwrap(),
}
};
Ok(__result)
}
pub type Parameters = Vec<Vec<u8>>;
#[doc(hidden)]
#[allow(unused_mut)]
pub fn encode_parameters<W: wasmbus_rpc::cbor::Write>(
mut e: &mut wasmbus_rpc::cbor::Encoder<W>,
val: &Parameters,
) -> RpcResult<()>
where
<W as wasmbus_rpc::cbor::Write>::Error: std::fmt::Display,
{
e.array(val.len() as u64)?;
for item in val.iter() {
e.bytes(item)?;
}
Ok(())
}
#[doc(hidden)]
pub fn decode_parameters(d: &mut wasmbus_rpc::cbor::Decoder<'_>) -> Result<Parameters, RpcError> {
let __result = {
if let Some(n) = d.array()? {
let mut arr: Vec<Vec<u8>> = Vec::with_capacity(n as usize);
for _ in 0..(n as usize) {
arr.push(d.bytes()?.to_vec())
}
arr
} else {
let mut arr: Vec<Vec<u8>> = Vec::new();
loop {
match d.datatype() {
Err(_) => break,
Ok(wasmbus_rpc::cbor::Type::Break) => break,
Ok(_) => arr.push(d.bytes()?.to_vec()),
}
}
arr
}
};
Ok(__result)
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct PingResult {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<SqlDbError>,
}
#[doc(hidden)]
#[allow(unused_mut)]
pub fn encode_ping_result<W: wasmbus_rpc::cbor::Write>(
mut e: &mut wasmbus_rpc::cbor::Encoder<W>,
val: &PingResult,
) -> RpcResult<()>
where
<W as wasmbus_rpc::cbor::Write>::Error: std::fmt::Display,
{
e.map(1)?;
if let Some(val) = val.error.as_ref() {
e.str("error")?;
encode_sql_db_error(e, val)?;
} else {
e.null()?;
}
Ok(())
}
#[doc(hidden)]
pub fn decode_ping_result(d: &mut wasmbus_rpc::cbor::Decoder<'_>) -> Result<PingResult, RpcError> {
let __result = {
let mut error: Option<Option<SqlDbError>> = Some(None);
let is_array = match d.datatype()? {
wasmbus_rpc::cbor::Type::Array => true,
wasmbus_rpc::cbor::Type::Map => false,
_ => {
return Err(RpcError::Deser(
"decoding struct PingResult, expected array or map".to_string(),
))
}
};
if is_array {
let len = d.fixed_array()?;
for __i in 0..(len as usize) {
match __i {
0 => {
error = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(decode_sql_db_error(d).map_err(|e| {
format!(
"decoding 'org.wasmcloud.interface.sqldb#SqlDbError': {}",
e
)
})?))
}
}
_ => d.skip()?,
}
}
} else {
let len = d.fixed_map()?;
for __i in 0..(len as usize) {
match d.str()? {
"error" => {
error = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(decode_sql_db_error(d).map_err(|e| {
format!(
"decoding 'org.wasmcloud.interface.sqldb#SqlDbError': {}",
e
)
})?))
}
}
_ => d.skip()?,
}
}
}
PingResult {
error: error.unwrap(),
}
};
Ok(__result)
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct QueryResult {
#[serde(rename = "numRows")]
#[serde(default)]
pub num_rows: u64,
pub columns: Columns,
#[serde(with = "serde_bytes")]
#[serde(default)]
pub rows: Vec<u8>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<SqlDbError>,
}
#[doc(hidden)]
#[allow(unused_mut)]
pub fn encode_query_result<W: wasmbus_rpc::cbor::Write>(
mut e: &mut wasmbus_rpc::cbor::Encoder<W>,
val: &QueryResult,
) -> RpcResult<()>
where
<W as wasmbus_rpc::cbor::Write>::Error: std::fmt::Display,
{
e.array(4)?;
e.u64(val.num_rows)?;
encode_columns(e, &val.columns)?;
e.bytes(&val.rows)?;
if let Some(val) = val.error.as_ref() {
encode_sql_db_error(e, val)?;
} else {
e.null()?;
}
Ok(())
}
#[doc(hidden)]
pub fn decode_query_result(
d: &mut wasmbus_rpc::cbor::Decoder<'_>,
) -> Result<QueryResult, RpcError> {
let __result = {
let mut num_rows: Option<u64> = None;
let mut columns: Option<Columns> = None;
let mut rows: Option<Vec<u8>> = None;
let mut error: Option<Option<SqlDbError>> = Some(None);
let is_array = match d.datatype()? {
wasmbus_rpc::cbor::Type::Array => true,
wasmbus_rpc::cbor::Type::Map => false,
_ => {
return Err(RpcError::Deser(
"decoding struct QueryResult, expected array or map".to_string(),
))
}
};
if is_array {
let len = d.fixed_array()?;
for __i in 0..(len as usize) {
match __i {
0 => num_rows = Some(d.u64()?),
1 => {
columns = Some(decode_columns(d).map_err(|e| {
format!("decoding 'org.wasmcloud.interface.sqldb#Columns': {}", e)
})?)
}
2 => rows = Some(d.bytes()?.to_vec()),
3 => {
error = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(decode_sql_db_error(d).map_err(|e| {
format!(
"decoding 'org.wasmcloud.interface.sqldb#SqlDbError': {}",
e
)
})?))
}
}
_ => d.skip()?,
}
}
} else {
let len = d.fixed_map()?;
for __i in 0..(len as usize) {
match d.str()? {
"numRows" => num_rows = Some(d.u64()?),
"columns" => {
columns = Some(decode_columns(d).map_err(|e| {
format!("decoding 'org.wasmcloud.interface.sqldb#Columns': {}", e)
})?)
}
"rows" => rows = Some(d.bytes()?.to_vec()),
"error" => {
error = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(decode_sql_db_error(d).map_err(|e| {
format!(
"decoding 'org.wasmcloud.interface.sqldb#SqlDbError': {}",
e
)
})?))
}
}
_ => d.skip()?,
}
}
}
QueryResult {
num_rows: if let Some(__x) = num_rows {
__x
} else {
return Err(RpcError::Deser(
"missing field QueryResult.num_rows (#0)".to_string(),
));
},
columns: if let Some(__x) = columns {
__x
} else {
return Err(RpcError::Deser(
"missing field QueryResult.columns (#1)".to_string(),
));
},
rows: if let Some(__x) = rows {
__x
} else {
return Err(RpcError::Deser(
"missing field QueryResult.rows (#2)".to_string(),
));
},
error: error.unwrap(),
}
};
Ok(__result)
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct SqlDbError {
#[serde(default)]
pub code: String,
#[serde(default)]
pub message: String,
}
#[doc(hidden)]
#[allow(unused_mut)]
pub fn encode_sql_db_error<W: wasmbus_rpc::cbor::Write>(
mut e: &mut wasmbus_rpc::cbor::Encoder<W>,
val: &SqlDbError,
) -> RpcResult<()>
where
<W as wasmbus_rpc::cbor::Write>::Error: std::fmt::Display,
{
e.array(2)?;
e.str(&val.code)?;
e.str(&val.message)?;
Ok(())
}
#[doc(hidden)]
pub fn decode_sql_db_error(d: &mut wasmbus_rpc::cbor::Decoder<'_>) -> Result<SqlDbError, RpcError> {
let __result = {
let mut code: Option<String> = None;
let mut message: Option<String> = None;
let is_array = match d.datatype()? {
wasmbus_rpc::cbor::Type::Array => true,
wasmbus_rpc::cbor::Type::Map => false,
_ => {
return Err(RpcError::Deser(
"decoding struct SqlDbError, expected array or map".to_string(),
))
}
};
if is_array {
let len = d.fixed_array()?;
for __i in 0..(len as usize) {
match __i {
0 => code = Some(d.str()?.to_string()),
1 => message = Some(d.str()?.to_string()),
_ => d.skip()?,
}
}
} else {
let len = d.fixed_map()?;
for __i in 0..(len as usize) {
match d.str()? {
"code" => code = Some(d.str()?.to_string()),
"message" => message = Some(d.str()?.to_string()),
_ => d.skip()?,
}
}
}
SqlDbError {
code: if let Some(__x) = code {
__x
} else {
return Err(RpcError::Deser(
"missing field SqlDbError.code (#0)".to_string(),
));
},
message: if let Some(__x) = message {
__x
} else {
return Err(RpcError::Deser(
"missing field SqlDbError.message (#1)".to_string(),
));
},
}
};
Ok(__result)
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct Statement {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub database: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parameters: Option<Parameters>,
#[serde(default)]
pub sql: String,
}
#[doc(hidden)]
#[allow(unused_mut)]
pub fn encode_statement<W: wasmbus_rpc::cbor::Write>(
mut e: &mut wasmbus_rpc::cbor::Encoder<W>,
val: &Statement,
) -> RpcResult<()>
where
<W as wasmbus_rpc::cbor::Write>::Error: std::fmt::Display,
{
e.map(3)?;
if let Some(val) = val.database.as_ref() {
e.str("database")?;
e.str(val)?;
} else {
e.null()?;
}
if let Some(val) = val.parameters.as_ref() {
e.str("parameters")?;
encode_parameters(e, val)?;
} else {
e.null()?;
}
e.str("sql")?;
e.str(&val.sql)?;
Ok(())
}
#[doc(hidden)]
pub fn decode_statement(d: &mut wasmbus_rpc::cbor::Decoder<'_>) -> Result<Statement, RpcError> {
let __result = {
let mut database: Option<Option<String>> = Some(None);
let mut parameters: Option<Option<Parameters>> = Some(None);
let mut sql: Option<String> = None;
let is_array = match d.datatype()? {
wasmbus_rpc::cbor::Type::Array => true,
wasmbus_rpc::cbor::Type::Map => false,
_ => {
return Err(RpcError::Deser(
"decoding struct Statement, expected array or map".to_string(),
))
}
};
if is_array {
let len = d.fixed_array()?;
for __i in 0..(len as usize) {
match __i {
0 => {
database = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(d.str()?.to_string()))
}
}
1 => {
parameters = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(decode_parameters(d).map_err(|e| {
format!(
"decoding 'org.wasmcloud.interface.sqldb#Parameters': {}",
e
)
})?))
}
}
2 => sql = Some(d.str()?.to_string()),
_ => d.skip()?,
}
}
} else {
let len = d.fixed_map()?;
for __i in 0..(len as usize) {
match d.str()? {
"database" => {
database = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(d.str()?.to_string()))
}
}
"parameters" => {
parameters = if wasmbus_rpc::cbor::Type::Null == d.datatype()? {
d.skip()?;
Some(None)
} else {
Some(Some(decode_parameters(d).map_err(|e| {
format!(
"decoding 'org.wasmcloud.interface.sqldb#Parameters': {}",
e
)
})?))
}
}
"sql" => sql = Some(d.str()?.to_string()),
_ => d.skip()?,
}
}
}
Statement {
database: database.unwrap(),
parameters: parameters.unwrap(),
sql: if let Some(__x) = sql {
__x
} else {
return Err(RpcError::Deser(
"missing field Statement.sql (#2)".to_string(),
));
},
}
};
Ok(__result)
}
#[async_trait]
pub trait SqlDb {
fn contract_id() -> &'static str {
"wasmcloud:sqldb"
}
async fn execute(&self, ctx: &Context, arg: &Statement) -> RpcResult<ExecuteResult>;
async fn query(&self, ctx: &Context, arg: &Statement) -> RpcResult<QueryResult>;
}
#[doc(hidden)]
#[async_trait]
pub trait SqlDbReceiver: MessageDispatch + SqlDb {
async fn dispatch(&self, ctx: &Context, message: Message<'_>) -> Result<Vec<u8>, RpcError> {
match message.method {
"Execute" => {
let value: Statement = wasmbus_rpc::common::deserialize(&message.arg)
.map_err(|e| RpcError::Deser(format!("'Statement': {}", e)))?;
let resp = SqlDb::execute(self, ctx, &value).await?;
let buf = wasmbus_rpc::common::serialize(&resp)?;
Ok(buf)
}
"Query" => {
let value: Statement = wasmbus_rpc::common::deserialize(&message.arg)
.map_err(|e| RpcError::Deser(format!("'Statement': {}", e)))?;
let resp = SqlDb::query(self, ctx, &value).await?;
let buf = wasmbus_rpc::common::serialize(&resp)?;
Ok(buf)
}
_ => Err(RpcError::MethodNotHandled(format!(
"SqlDb::{}",
message.method
))),
}
}
}
#[derive(Clone, Debug)]
pub struct SqlDbSender<T: Transport> {
transport: T,
}
impl<T: Transport> SqlDbSender<T> {
pub fn via(transport: T) -> Self {
Self { transport }
}
pub fn set_timeout(&self, interval: std::time::Duration) {
self.transport.set_timeout(interval);
}
}
#[cfg(target_arch = "wasm32")]
impl SqlDbSender<wasmbus_rpc::actor::prelude::WasmHost> {
pub fn new() -> Self {
let transport =
wasmbus_rpc::actor::prelude::WasmHost::to_provider("wasmcloud:sqldb", "default")
.unwrap();
Self { transport }
}
pub fn new_with_link(link_name: &str) -> wasmbus_rpc::error::RpcResult<Self> {
let transport =
wasmbus_rpc::actor::prelude::WasmHost::to_provider("wasmcloud:sqldb", link_name)?;
Ok(Self { transport })
}
}
#[async_trait]
impl<T: Transport + std::marker::Sync + std::marker::Send> SqlDb for SqlDbSender<T> {
#[allow(unused)]
async fn execute(&self, ctx: &Context, arg: &Statement) -> RpcResult<ExecuteResult> {
let buf = wasmbus_rpc::common::serialize(arg)?;
let resp = self
.transport
.send(
ctx,
Message {
method: "SqlDb.Execute",
arg: Cow::Borrowed(&buf),
},
None,
)
.await?;
let value: ExecuteResult = wasmbus_rpc::common::deserialize(&resp)
.map_err(|e| RpcError::Deser(format!("'{}': ExecuteResult", e)))?;
Ok(value)
}
#[allow(unused)]
async fn query(&self, ctx: &Context, arg: &Statement) -> RpcResult<QueryResult> {
let buf = wasmbus_rpc::common::serialize(arg)?;
let resp = self
.transport
.send(
ctx,
Message {
method: "SqlDb.Query",
arg: Cow::Borrowed(&buf),
},
None,
)
.await?;
let value: QueryResult = wasmbus_rpc::common::deserialize(&resp)
.map_err(|e| RpcError::Deser(format!("'{}': QueryResult", e)))?;
Ok(value)
}
}