pub fn decode_login_qr_url(qr_url: &str) -> Option<(u64, i32)> {
if !qr_url.starts_with("https://s.team/q/") && !qr_url.starts_with("http://s.team/q/") {
return None;
}
let parts: Vec<&str> = qr_url.split('/').collect();
let mut iter = parts.iter().skip_while(|&&part| part != "q");
iter.next()?;
let client_id_str = iter.next()?;
let version_str = iter.next()?;
let version_clean: String = version_str.chars().take_while(|c| c.is_ascii_digit()).collect();
let client_id = client_id_str.parse::<u64>().ok()?;
let version = version_clean.parse::<i32>().ok()?;
Some((client_id, version))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_decode_login_qr_url() {
let url = "https://s.team/q/12345/1";
assert_eq!(decode_login_qr_url(url), Some((12345, 1)));
let url_with_query = "https://s.team/q/12345/1?foo=bar";
assert_eq!(decode_login_qr_url(url_with_query), Some((12345, 1)));
let invalid = "https://google.com";
assert_eq!(decode_login_qr_url(invalid), None);
}
}