dynasty 1.4.1

Dynasty Reader's CLI downloader
Documentation
use std::path::Path;

use reqwest::{
    header::{self, AsHeaderName, HeaderMap},
    Response, Url,
};

pub fn get_content_length_from_response(response: &Response) -> u64 {
    get_str_from_headers(response.headers(), header::CONTENT_LENGTH)
        .and_then(|value| value.parse().ok())
        .unwrap_or_default()
}

pub fn get_file_extension_from_url(url: &Url) -> Option<String> {
    if let Some(segments) = url.path_segments() {
        if let Some(last) = segments.last() {
            return Path::new(last)
                .extension()
                .and_then(|s| s.to_str().map(|s| s.to_string()));
        }
    }

    None
}

pub fn get_str_from_headers<K: AsHeaderName>(headers: &HeaderMap, key: K) -> Option<&str> {
    headers.get(key).and_then(|v| v.to_str().ok())
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn should_get_file_extension_from_url() {
        let predicates = [
            (
                Url::parse("https://dynasty-scans.com/system/releases/000/037/390/ch04_001.jpg")
                    .unwrap(),
                "jpg".to_string(),
            ),
            (
                Url::parse("https://dynasty-scans.com/system/releases/000/037/390/ch04_001.png")
                    .unwrap(),
                "png".to_string(),
            ),
        ];

        for (left, right) in predicates {
            assert_eq!(get_file_extension_from_url(&left), Some(right))
        }
    }

    #[test]
    fn should_fail_get_file_extension_from_url() {
        let predicates = [
            Url::parse("https://dynasty-scans.com/system/releases/000/037/390/ch04_001").unwrap(),
            Url::parse("https://dynasty-scans.com/system/releases").unwrap(),
        ];

        for predicate in predicates {
            assert_eq!(get_file_extension_from_url(&predicate), None)
        }
    }
}