use crate::XSorts;
use alux_ext::ext;
use ambassador::delegatable_trait;
#[delegatable_trait]
pub trait XRequestAlg: XSorts {
fn tweet_request(&self, address: impl Into<String>) -> Self::Request;
}
pub trait XRequestViewAlg: XSorts {
fn request_address<'a>(&self, request: &'a Self::Request) -> &'a str;
}
#[ext(name = XRequestExt)]
pub impl<This> This
where
This: XRequestAlg,
{
fn status_request(&self, id: &str) -> This::Request {
self.tweet_request(format!("{READING_ADDRESS}?id={id}&lang=en&token={}", reading_token(id)))
}
}
pub const READING_ADDRESS: &str = "https://cdn.syndication.twimg.com/tweet-result";
#[must_use]
pub fn reading_token(id: &str) -> String {
const DIGITS: &[u8; 36] = b"0123456789abcdefghijklmnopqrstuvwxyz";
let mut remaining = id
.bytes()
.fold(0_u128, |carried, digit| carried.saturating_mul(10).saturating_add(u128::from(digit.wrapping_sub(b'0'))));
let mut stated = Vec::new();
while remaining > 0 {
stated.push(DIGITS[usize::try_from(remaining % 36).unwrap_or_default()]);
remaining /= 36;
}
if stated.is_empty() {
stated.push(DIGITS[0]);
}
stated.reverse();
String::from_utf8(stated).unwrap_or_default()
}