1use crate::XSorts;
2use alux_ext::ext;
3use ambassador::delegatable_trait;
4
5#[delegatable_trait]
7pub trait XRequestAlg: XSorts {
8 fn tweet_request(&self, address: impl Into<String>) -> Self::Request;
10}
11
12pub trait XRequestViewAlg: XSorts {
14 fn request_address<'a>(&self, request: &'a Self::Request) -> &'a str;
16}
17
18#[ext(name = XRequestExt)]
20pub impl<This> This
21where
22 This: XRequestAlg,
23{
24 fn status_request(&self, id: &str) -> This::Request {
26 self.tweet_request(format!("{READING_ADDRESS}?id={id}&lang=en&token={}", reading_token(id)))
27 }
28}
29
30pub const READING_ADDRESS: &str = "https://cdn.syndication.twimg.com/tweet-result";
35
36#[must_use]
43pub fn reading_token(id: &str) -> String {
44 const DIGITS: &[u8; 36] = b"0123456789abcdefghijklmnopqrstuvwxyz";
45 let mut remaining = id
46 .bytes()
47 .fold(0_u128, |carried, digit| carried.saturating_mul(10).saturating_add(u128::from(digit.wrapping_sub(b'0'))));
48 let mut stated = Vec::new();
49 while remaining > 0 {
50 stated.push(DIGITS[usize::try_from(remaining % 36).unwrap_or_default()]);
51 remaining /= 36;
52 }
53 if stated.is_empty() {
54 stated.push(DIGITS[0]);
55 }
56 stated.reverse();
57 String::from_utf8(stated).unwrap_or_default()
58}