//! 注册表结构审计:域名归属、路由回环、可疑条目。 use std::collections::HashMap; fn main() { let mut owners: HashMap<&str, Vec<&str>> = HashMap::new(); for platform in social::providers() { for domain in platform.domains() { owners.entry(domain).or_default().push(platform.id()); } } println!("== 一个域名被多个平台声明(后者永远命中不到)=="); let mut clashes: Vec<_> = owners.iter().filter(|(_, ids)| ids.len() > 1).collect(); clashes.sort(); for (domain, ids) in &clashes { println!(" {domain}: {ids:?}"); } if clashes.is_empty() { println!(" (无)"); } println!("\n== 路由回环失败(声明了这个域名但路由不到自己)=="); // 路径级平台:声明的是「域名 + 特定路径」,根路径本来就该让给别人。 // googlemaps 声明 google.com 是为了认领 `/maps/...`,搜索/邮箱等不是它的。 const PATH_SCOPED: &[(&str, &str)] = &[("googlemaps", "google.com")]; let mut broken = 0; for platform in social::providers() { for domain in platform.domains() { let probe = format!("https://www.{domain}/"); let routed = social::parse(&probe).map(|r| r.platform); if routed != Some(platform.id()) { if PATH_SCOPED .iter() .any(|(id, scoped)| *id == platform.id() && *scoped == *domain) { println!( " {} 声明 {domain}(路径级,根路径不认领,符合预期)", platform.id() ); continue; } println!( " {} 声明 {domain},但 https://www.{domain}/ 路由到 {:?}", platform.id(), routed ); broken += 1; } } } if broken == 0 { println!(" (无)"); } println!("\n== 可疑域名(标签数 < 2,会吞掉整个 TLD)=="); let mut suspicious = 0; for platform in social::providers() { for domain in platform.domains() { if domain.split('.').count() < 2 { println!(" {}: {domain}", platform.id()); suspicious += 1; } } } if suspicious == 0 { println!(" (无)"); } println!("\n== 注册表规模 =="); let mut by_category: HashMap<&str, usize> = HashMap::new(); for platform in social::providers() { *by_category.entry(platform.category().as_str()).or_default() += 1; } let mut rows: Vec<_> = by_category.into_iter().collect(); rows.sort_by_key(|(_, count)| std::cmp::Reverse(*count)); for (category, count) in rows { println!(" {category}: {count}"); } println!(" 合计: {}", social::provider_count()); println!(" 域名条目: {}", owners.len()); println!("\n== 声明了 oEmbed 端点的平台 =="); let mut declared = 0; for platform in social::providers() { if let Some(template) = platform.oembed() { println!(" {} -> {template}", platform.id()); declared += 1; } } println!(" 合计: {declared} / {}", social::provider_count()); }