inertia-rust 2.4.6

A Rust server-adapter for building modern MVC web apps with Inertia.
Documentation
use std::time::Duration;

use crate::error::InertiaError;
use crate::{InertiaPage, InertiaSSRPage};

pub(crate) async fn request_page_render(
    server_url: &reqwest::Url,
    page: &InertiaPage<'_>,
) -> Result<InertiaSSRPage, InertiaError> {
    let mut render_endpoint = server_url.clone();
    render_endpoint.set_path("render");

    let response = reqwest::Client::new()
        .get(render_endpoint)
        .header("Content-Type", "application/json")
        .header("Accept", "application/json")
        .json(&page)
        .timeout(Duration::from_secs(5))
        .send()
        .await
        .map_err(|err| {
            InertiaError::SsrError(format!(
                "Failed to render the page at the SSR Server: {}",
                err
            ))
        })?;

    let body = response
        .bytes()
        .await
        .map_err(|err| {
            InertiaError::SsrError(format!("Failed to read SSR response's bytes: {err}"))
        })?
        .to_vec();

    serde_json::from_slice::<InertiaSSRPage>(&body).map_err(|json_err| {
        let body_as_text = String::from_utf8(body);
        match body_as_text {
            Ok(text_body) => InertiaError::SsrError(format!(
                "Failed to deserialize InertiaSSRPage object \
                from body with error: {json_err}. Received body: {text_body}"
            )),
            Err(text_error) => InertiaError::SsrError(format!(
                "Failed to deserialize InertiaSSRPage object \
                from body with error: {json_err}. Also failed to read bytes as text \
                with error: {text_error}",
            )),
        }
    })
}