filigree 0.4.1

Filigree web application framework
Documentation
use async_trait::async_trait;
use reqwest::Response;
use tracing::Level;

/// Code to simply inspect the body of an error response.
/// This trait is implemented for [reqwest::Response]
#[async_trait]
pub trait InspectResponseError {
    /// Log the error for a failed request
    async fn print_error_for_status(self) -> reqwest::Result<Response>;
}

#[async_trait]
impl InspectResponseError for reqwest::Response {
    async fn print_error_for_status(self) -> reqwest::Result<Response> {
        let e = self.error_for_status_ref();
        let Err(e) = e else { return Ok(self) };

        let status = e.status().map(|s| s.as_u16()).unwrap_or(0);
        let url = e.url().map(|u| u.as_str()).unwrap_or("<none>");

        let body = self.text().await.unwrap_or_default();

        tracing::event!(Level::ERROR, %status, %url, %body, "Request failed");

        Err(e)
    }
}