use serde::Deserialize;
use topcoat_core::{context::Cx, error::Result};
use topcoat_router::{
Body, HeaderName, HeaderValue, Method,
content::Json,
error::rewrite,
header,
request::{FromRequest, headers, method, uri},
response::Response,
};
use crate::SignalValues;
pub static RUNTIME_HEADER: HeaderName = HeaderName::from_static("x-topcoat-runtime");
static RERUN: HeaderValue = HeaderValue::from_static("true");
#[derive(Debug, Deserialize)]
struct PageRerunRequest {
#[serde(default)]
signals: SignalValues,
}
pub(super) fn requested(cx: &Cx) -> bool {
*method(cx) == Method::POST && headers(cx).get(&RUNTIME_HEADER) == Some(&RERUN)
}
pub(super) async fn dispatch(cx: &Cx, body: Body) -> Result<Response> {
let Json(request) = Json::<PageRerunRequest>::from_request(cx, body).await?;
let mut headers = headers(cx).clone();
headers.remove(&RUNTIME_HEADER);
headers.remove(header::CONTENT_TYPE);
headers.remove(header::CONTENT_LENGTH);
let uri = uri(cx);
let target = uri
.path_and_query()
.map_or(uri.path(), |path_and_query| path_and_query.as_str());
Err(rewrite(target, Body::empty())
.method(Method::GET)
.headers(headers)
.with(request.signals)
.into())
}