muffy 0.4.4

The static website validator
Documentation
use super::utility::truncate_url;
use crate::response::Response;
use alloc::borrow::Cow;
use http::StatusCode;
use serde::Serialize;

#[derive(Debug, Serialize)]
pub struct RenderedResponse<'a> {
    url: Cow<'a, str>,
    #[serde(with = "http_serde::status_code")]
    status: StatusCode,
    latency: u128,
}

impl<'a> RenderedResponse<'a> {
    pub fn url(&self) -> &str {
        &self.url
    }

    pub const fn status(&self) -> StatusCode {
        self.status
    }

    pub const fn duration(&self) -> u128 {
        self.latency
    }
}

impl<'a> From<&'a Response> for RenderedResponse<'a> {
    fn from(response: &'a Response) -> Self {
        Self {
            url: truncate_url(response.url().as_str()),
            status: response.status(),
            latency: response.duration().as_millis(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use pretty_assertions::assert_eq;
    use url::Url;

    #[test]
    fn keep_http_url() {
        assert_eq!(
            RenderedResponse::from(&Response::new(
                Url::parse("https://foo.com").unwrap(),
                Default::default(),
                Default::default(),
                Default::default(),
                Default::default(),
            ))
            .url(),
            "https://foo.com/"
        );
    }

    #[test]
    fn truncate_data_url() {
        assert_eq!(
            RenderedResponse::from(&Response::new(
                Url::parse(
                    "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLz4="
                )
                .unwrap(),
                Default::default(),
                Default::default(),
                Default::default(),
                Default::default(),
            ))
            .url(),
            "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcm..."
        );
    }
}