use async_trait::async_trait;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
pub struct HttpRequest {
pub method: String,
pub url: String,
}
#[derive(Serialize, Deserialize)]
pub struct HttpResponse {
pub status: u16, pub body: Vec<u8>, }
impl crux_core::capability::Operation for HttpRequest {
type Output = HttpResponse;
}
#[async_trait]
pub(crate) trait EffectSender {
async fn send(&self, effect: HttpRequest) -> HttpResponse;
}
#[async_trait]
impl<Ev> EffectSender for crux_core::capability::CapabilityContext<HttpRequest, Ev>
where
Ev: 'static,
{
async fn send(&self, effect: HttpRequest) -> HttpResponse {
crux_core::capability::CapabilityContext::request_from_shell(self, effect).await
}
}
impl From<crate::Request> for HttpRequest {
fn from(req: crate::Request) -> Self {
HttpRequest {
method: req.method().to_string(),
url: req.url().to_string(),
}
}
}
impl From<HttpResponse> for crate::ResponseAsync {
fn from(effect_response: HttpResponse) -> Self {
let mut res = crate::http::Response::new(effect_response.status);
res.set_body(effect_response.body);
crate::ResponseAsync::new(res)
}
}