use http::StatusCode;
use wasip2::http::types::IncomingResponse;
use crate::http::body::{Body, BodyHint};
use crate::http::error::{Context, Error};
use crate::http::fields::{HeaderMap, header_map_from_wasi};
pub use http::response::{Builder, Response};
pub(crate) fn try_from_incoming(incoming: IncomingResponse) -> Result<Response<Body>, Error> {
let headers: HeaderMap = header_map_from_wasi(incoming.headers())?;
let status = StatusCode::from_u16(incoming.status())
.map_err(|err| anyhow::anyhow!("wasi provided invalid status code ({err})"))?;
let hint = BodyHint::from_headers(&headers)?;
let incoming_body = incoming
.consume()
.expect("cannot call `consume` twice on incoming response");
let body = Body::from_incoming(incoming_body, hint);
let mut builder = Response::builder().status(status);
if let Some(headers_mut) = builder.headers_mut() {
*headers_mut = headers;
}
builder.body(body).context("building response")
}