konector 0.1.3

Sync GitHub SSH keys with your servers.
use futures::future;
use serde::Deserialize;

pub async fn fetch_users<'a>(
    usernames: Vec<String>,
) -> Result<Vec<GitHubResponse>, Box<dyn std::error::Error>> {
    let promises = usernames.iter().map(fetch_api);
    let data = future::try_join_all(promises).await?;
    let data: Vec<GitHubResponse> = data.into_iter().flatten().collect();

    Ok(data)
}

#[derive(Deserialize, Debug)]
pub struct GitHubResponse {
    pub key: String,
}

async fn fetch_api(username: &String) -> Result<Vec<GitHubResponse>, Box<dyn std::error::Error>> {
    let encoded_user = urlencoding::encode(username.as_str());
    let uri = format!(
        "https://api.github.com/users/{user}/keys",
        user = encoded_user
    );

    let req = reqwest::Client::new();
    let body = req
        .get(uri)
        .header("User-Agent", "Axios/1.1.3")
        .send()
        .await?
        .text()
        .await?;

    let json: Vec<GitHubResponse> = serde_json::from_str(body.as_str())?;

    Ok(json)
}