1use std::{env, error::Error, io::{self, Write}}; 2 3use tokio::fs; 4 5#[tokio::main] 6async fn main() { 7 real_main().await.unwrap(); 8} 9 10async fn real_main() -> Result<(), Box<dyn Error>> { 11 let gh = octocrab::OctocrabBuilder::default() 12 .personal_token(env::var("GITHUB_PAT").expect("no GITHUB_PAT configured")) 13 .build()?; 14 15 // first run: nix-instantiate -A lib.maintainers --eval --strict --json > maintainers.json 16 let data: serde_json::Value = serde_json::from_str(&fs::read_to_string("maintainers.json").await?)?; 17 18 let data = data.as_object().unwrap(); 19 let total = data.len(); 20 for (i, (maintainer_name, v)) in data.iter().enumerate() { 21 print!("\r{i}/{total}"); 22 io::stdout().flush()?; 23 let Some(github_id) = v.get("githubId") else { 24 println!("\rWARN: no id for {maintainer_name}"); 25 continue; 26 }; 27 let Some(github) = v.get("github") else { 28 println!("\rWARN: no username for {maintainer_name}"); 29 continue; 30 }; 31 let Ok(name) = gh.users_by_id(github_id.as_u64().unwrap()).profile().await else { 32 println!("\rWARN: error fetching {maintainer_name}"); 33 continue; 34 }; 35 let name = name.login; 36 if name.to_ascii_lowercase() != github.as_str().unwrap().to_ascii_lowercase() { 37 println!("\rERR: {maintainer_name} has github = {github}, but username really is '{name}'"); 38 } 39 } 40 41 Ok(()) 42}