wasmcloud_actor_http_server/
generated.rs

1extern crate rmp_serde as rmps;
2use rmps::{Deserializer, Serializer};
3use serde::{Deserialize, Serialize};
4use std::io::Cursor;
5
6#[cfg(feature = "guest")]
7extern crate wapc_guest as guest;
8#[cfg(feature = "guest")]
9use guest::prelude::*;
10
11#[cfg(feature = "guest")]
12pub struct Handlers {}
13
14#[cfg(feature = "guest")]
15impl Handlers {
16    /// Register a function to handle an incoming HTTP request from a linked provider
17    pub fn register_handle_request(f: fn(Request) -> HandlerResult<Response>) {
18        *HANDLE_REQUEST.write().unwrap() = Some(f);
19        register_function(&"HandleRequest", handle_request_wrapper);
20    }
21}
22
23#[cfg(feature = "guest")]
24lazy_static::lazy_static! {
25static ref HANDLE_REQUEST: std::sync::RwLock<Option<fn(Request) -> HandlerResult<Response>>> = std::sync::RwLock::new(None);
26}
27
28#[cfg(feature = "guest")]
29fn handle_request_wrapper(input_payload: &[u8]) -> CallResult {
30    let input = deserialize::<Request>(input_payload)?;
31    let lock = HANDLE_REQUEST.read().unwrap().unwrap();
32    let result = lock(input)?;
33    serialize(result)
34}
35
36/// HTTP Request object
37#[derive(Debug, PartialEq, Deserialize, Serialize, Default, Clone)]
38pub struct Request {
39    #[serde(rename = "method")]
40    pub method: String,
41    #[serde(rename = "path")]
42    pub path: String,
43    #[serde(rename = "queryString")]
44    pub query_string: String,
45    #[serde(rename = "header")]
46    pub header: std::collections::HashMap<String, String>,
47    #[serde(with = "serde_bytes")]
48    #[serde(rename = "body")]
49    pub body: Vec<u8>,
50}
51
52/// HTTP Response object
53#[derive(Debug, PartialEq, Deserialize, Serialize, Default, Clone)]
54pub struct Response {
55    #[serde(rename = "statusCode")]
56    pub status_code: u32,
57    #[serde(rename = "status")]
58    pub status: String,
59    #[serde(rename = "header")]
60    pub header: std::collections::HashMap<String, String>,
61    #[serde(with = "serde_bytes")]
62    #[serde(rename = "body")]
63    pub body: Vec<u8>,
64}
65
66/// The standard function for serializing codec structs into a format that can be
67/// used for message exchange between actor and host. Use of any other function to
68/// serialize could result in breaking incompatibilities.
69pub fn serialize<T>(
70    item: T,
71) -> ::std::result::Result<Vec<u8>, Box<dyn std::error::Error + Send + Sync>>
72where
73    T: Serialize,
74{
75    let mut buf = Vec::new();
76    item.serialize(&mut Serializer::new(&mut buf).with_struct_map())?;
77    Ok(buf)
78}
79
80/// The standard function for de-serializing codec structs from a format suitable
81/// for message exchange between actor and host. Use of any other function to
82/// deserialize could result in breaking incompatibilities.
83pub fn deserialize<'de, T: Deserialize<'de>>(
84    buf: &[u8],
85) -> ::std::result::Result<T, Box<dyn std::error::Error + Send + Sync>> {
86    let mut de = Deserializer::new(Cursor::new(buf));
87    match Deserialize::deserialize(&mut de) {
88        Ok(t) => Ok(t),
89        Err(e) => Err(format!("Failed to de-serialize: {}", e).into()),
90    }
91}