herta/
url.rs

1use std::fmt::{Display, Write};
2
3use url::Url;
4
5#[derive(Debug)]
6pub enum UrlError<'a> {
7    NoBaseUrl(&'a Url),
8}
9
10pub(crate) fn get_original_image(url: &Url) -> Result<Url, UrlError<'_>> {
11    let cb = url
12        .query_pairs()
13        .filter(|(key, _val)| key.contains("cb"))
14        .fold(String::new(), |mut out, (k, v)| {
15            let _ = write!(out, "{}={}", k, v);
16            out
17        });
18
19    let segments = url
20        .path_segments()
21        .ok_or(UrlError::NoBaseUrl(url))?
22        .map_while(|seg| {
23            if seg.contains("scale-to-width") {
24                return None;
25            }
26
27            Some(seg)
28        })
29        .collect::<Vec<_>>()
30        .join("/");
31
32    let base = format!(
33        "{}://{}/{}",
34        url.scheme(),
35        url.host_str().unwrap(),
36        segments
37    );
38    let mut res = Url::parse(&base).unwrap();
39
40    res.set_query(Some(cb.as_str()));
41
42    Ok(res)
43}
44
45pub(crate) fn canonicalize<U: Display>(url: U) -> String {
46    format!("https://honkai-star-rail.fandom.com{}", url)
47}
48
49#[cfg(test)]
50mod test {
51    use super::*;
52
53    #[test]
54    fn get_original_image_works() {
55        let raw = "https://static.wikia.nocookie.net/houkai-star-rail/images/c/c2/Character_Clara_Splash_Art.png/revision/latest/scale-to-width-down/185?cb=20230216231958";
56        let expected = "https://static.wikia.nocookie.net/houkai-star-rail/images/c/c2/Character_Clara_Splash_Art.png/revision/latest?cb=20230216231958";
57
58        let url = Url::parse(raw).unwrap();
59        let expected_url = Url::parse(expected).unwrap();
60
61        let original_image = get_original_image(&url);
62
63        assert!(original_image.is_ok());
64        assert_eq!(original_image.unwrap(), expected_url);
65    }
66}