main
//! 注册表结构审计:域名归属、路由回环、可疑条目。
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());
}