use momento_functions_bytes::Data;
use thiserror::Error;
use crate::{request::Request, wit::momento::http::http};
#[derive(Debug, Error)]
pub enum HttpError {
#[error("internal error")]
InternalError,
#[error("request error: {0}")]
RequestError(String),
#[error("invalid url '{url}': {error}")]
InvalidUrl { url: String, error: String },
#[error("invalid header name '{header}': {error}")]
InvalidHeaderName { header: String, error: String },
#[error("invalid header value '{value}': {error}")]
InvalidHeaderValue { value: String, error: String },
}
impl From<http::Error> for HttpError {
fn from(e: http::Error) -> Self {
match e {
http::Error::InternalError => HttpError::InternalError,
http::Error::RequestError(s) => HttpError::RequestError(s),
http::Error::InvalidUrl(u) => HttpError::InvalidUrl {
url: u.url,
error: u.error,
},
http::Error::InvalidHeaderName(h) => HttpError::InvalidHeaderName {
header: h.header,
error: h.error,
},
http::Error::InvalidHeaderValue(v) => HttpError::InvalidHeaderValue {
value: v.value,
error: v.error,
},
}
}
}
pub struct Response {
pub status: u16,
pub headers: Vec<(String, String)>,
pub body: Data,
}
impl From<http::Response> for Response {
fn from(r: http::Response) -> Self {
Response {
status: r.status,
headers: r.headers,
body: Data::from(r.body),
}
}
}
pub fn invoke(request: Request) -> Result<Response, HttpError> {
http::invoke(request.into())
.map(Into::into)
.map_err(Into::into)
}