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)
}
}
}