git-next-forge-github 0.14.1

GitHub support for git-next, the trunk-based development manager
Documentation
//
use crate as github;
use git_next_core::{git, server::RepoListenUrl, WebhookId};

// https://docs.github.com/en/rest/repos/webhooks?apiVersion=2022-11-28#list-repository-webhooks
pub async fn list(
    github: &github::Github,
    repo_listen_url: &RepoListenUrl,
) -> git::forge::webhook::Result<Vec<WebhookId>> {
    let mut ids: Vec<WebhookId> = vec![];
    let repo_details = &github.repo_details;
    let hostname = &repo_details.forge.hostname();
    let net = &github.net;
    let mut page = 1;
    loop {
        let result = net
            .get(format!(
                "https://api.{hostname}/repos/{}/hooks?page={page}",
                repo_details.repo_path,
            ))
            .headers(github::webhook::headers(repo_details.forge.token()))
            .send()
            .await;
        match result {
            Ok(response) => match response.json::<Vec<github::GithubHook>>().await {
                Err(err) => {
                    tracing::warn!(?err, "failed");
                    return Err(git::forge::webhook::Error::NetworkResponseEmpty);
                }
                Ok(list) => {
                    if list.is_empty() {
                        return Ok(ids);
                    }
                    for hook in list {
                        if hook
                            .url()
                            .as_ref()
                            .starts_with(&repo_listen_url.to_string())
                        {
                            ids.push(hook.id());
                        }
                    }
                    page += 1;
                }
            },
            Err(e) => {
                return Err(git::forge::webhook::Error::Network(e));
            }
        };
    }
}