jirashell/jira.go

100 lines
2.9 KiB
Go

package main
import (
"context"
"errors"
"fmt"
jira "github.com/andygrunwald/go-jira/v2/cloud"
"github.com/charmbracelet/huh/spinner"
)
var errorAborted = errors.New("aborted by user")
func CreateSpinner(title string) *spinner.Spinner {
return spinner.New().
Title(" " + title).
Type(spinner.Globe)
}
func RunSpinner[T any](title string, callback func() (*T, any, error)) (*T, error) {
var result *T
var err error
err2 := CreateSpinner(title).
Action(func() {
result, _, err = callback()
}).Run()
if err2 != nil {
return nil, err2
}
if result == nil {
return nil, errorAborted
}
return result, err
}
func GetAllStatuses(projectId string) (*jira.IssueTypesWithStatus, error) {
return RunSpinner("Fetching statuses...", func() (*jira.IssueTypesWithStatus, any, error) {
return jiraClient.Project.GetAllStatuses(context.Background(), projectId)
})
}
func GetUserData() (*jira.User, error) {
return RunSpinner("Fetching user info...", func() (*jira.User, any, error) {
return jiraClient.User.GetCurrentUser(context.Background())
})
}
func GetAllProjects() (*jira.ProjectList, error) {
return RunSpinner("Fetching all projects...", func() (*jira.ProjectList, any, error) {
return jiraClient.Project.GetAll(context.Background(), nil)
})
}
func GetAllBoardsForProject(projectIdOrKey string) (*jira.BoardsList, error) {
return RunSpinner(fmt.Sprintf("Fetching boards for project '%s'...", projectIdOrKey), func() (*jira.BoardsList, any, error) {
return jiraClient.Board.GetAllBoards(context.Background(), &jira.BoardListOptions{ProjectKeyOrID: projectIdOrKey})
})
}
func GetBoardConfiguration(boardId int) (*jira.BoardConfiguration, error) {
return RunSpinner("Fetching board...", func() (*jira.BoardConfiguration, any, error) {
return jiraClient.Board.GetBoardConfiguration(context.Background(), boardId)
})
}
func GetCurrentSprint(boardId int) (*jira.Sprint, error) {
list, err := RunSpinner("Fetching sprint...", func() (*jira.SprintsList, any, error) {
return jiraClient.Board.GetAllSprints(context.Background(), int64(boardId), &jira.GetAllSprintsOptions{
State: "active",
})
})
if err != nil {
return nil, err
}
if len(list.Values) == 0 {
return nil, errors.New("No active sprint found")
}
if len(list.Values) > 1 {
return nil, errors.New("Multiple active sprints found")
}
return &list.Values[0], nil
}
func GetIssuesForSprint(sprintId int) ([]jira.Issue, error) {
issues, err := RunSpinner("Fetching issues...", func() (*[]jira.Issue, any, error) {
list, t, err := jiraClient.Sprint.GetIssuesForSprint(context.Background(), sprintId)
return &list, t, err
})
if issues == nil {
return nil, err
} else {
return *issues, err
}
}
func GetIssue(issueKey string) (*jira.Issue, error) {
return RunSpinner("Fetching issue...", func() (*jira.Issue, any, error) {
return jiraClient.Issue.Get(context.Background(), issueKey, nil)
})
}