;;; ghpr-api.el --- Interactions for the GitHub API -*- lexical-binding: t -*- ;; This file is not part of GNU Emacs ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Provides procedures for interacting with the GitHub API, including ;; authentication. ;;; Code: (require 'auth-source) (require 'request) (require 'json) (defun ghpr--get-token () "Retrieve GitHub authentication token from auth-sources. Returns the token string if found, nil otherwise." (auth-source-pick-first-password :host "api.github.com")) (defun ghpr--parse-api-pr (pr) "Parse a single pull request object, keeping only essential fields." (let* ((get (lambda (field) (alist-get field pr))) (base (get 'base)) (user (get 'user))) `((url . ,(get 'url)) (id . ,(get 'id)) (diff_url . ,(get 'diff_url)) (patch_url . ,(get 'patch_url)) (number . ,(get 'number)) (state . ,(get 'state)) (locked . ,(get 'locked)) (title . ,(get 'title)) (body . ,(get 'body)) (username . ,(alist-get 'login user)) (base_sha . ,(alist-get 'sha base)) (merge_commit_sha . ,(get 'merge_commit_sha))))) (defun ghpr--parse-api-pr-list (pr-list) "Parse a list of pull request objects, keeping only essential fields." (mapcar #'ghpr--parse-api-pr pr-list)) (defun ghpr--list-open-prs (repo-name) "List open pull requests for REPO-NAME in owner/repo format. Returns a list of pull request objects on success, nil on failure." (let ((token (ghpr--get-token)) (url (format "https://api.github.com/repos/%s/pulls?state=open" repo-name)) (result nil)) (when token (request url :type "GET" :headers `(("Accept" . "application/vnd.github+json") ("Authorization" . ,(format "Bearer %s" token)) ("X-GitHub-Api-Version" . "2022-11-28")) :parser 'json-read :sync t :success (cl-function (lambda (&key data &allow-other-keys) (setq result (ghpr--parse-api-pr-list data)))) :error (cl-function (lambda (&key error-thrown &allow-other-keys) (message "Error fetching pull requests: %s" error-thrown))))) result)) (provide 'ghpr-api) ;;; ghpr-api.el ends here