cli/pkg/search/result.go

232 lines
6 KiB
Go

package search
import (
"reflect"
"strings"
"time"
)
var RepositoryFields = []string{
"createdAt",
"defaultBranch",
"description",
"forksCount",
"fullName",
"hasDownloads",
"hasIssues",
"hasPages",
"hasProjects",
"hasWiki",
"homepage",
"id",
"isArchived",
"isDisabled",
"isFork",
"isPrivate",
"language",
"license",
"name",
"openIssuesCount",
"owner",
"pushedAt",
"size",
"stargazersCount",
"updatedAt",
"url",
"visibility",
"watchersCount",
}
var IssueFields = []string{
"assignees",
"author",
"authorAssociation",
"body",
"closedAt",
"commentsCount",
"createdAt",
"id",
"isLocked",
"isPullRequest",
"labels",
"number",
"repository",
"state",
"title",
"updatedAt",
"url",
}
type RepositoriesResult struct {
IncompleteResults bool `json:"incomplete_results"`
Items []Repository `json:"items"`
Total int `json:"total_count"`
}
type IssuesResult struct {
IncompleteResults bool `json:"incomplete_results"`
Items []Issue `json:"items"`
Total int `json:"total_count"`
}
type Repository struct {
CreatedAt time.Time `json:"created_at"`
DefaultBranch string `json:"default_branch"`
Description string `json:"description"`
ForksCount int `json:"forks_count"`
FullName string `json:"full_name"`
HasDownloads bool `json:"has_downloads"`
HasIssues bool `json:"has_issues"`
HasPages bool `json:"has_pages"`
HasProjects bool `json:"has_projects"`
HasWiki bool `json:"has_wiki"`
Homepage string `json:"homepage"`
ID string `json:"node_id"`
IsArchived bool `json:"archived"`
IsDisabled bool `json:"disabled"`
IsFork bool `json:"fork"`
IsPrivate bool `json:"private"`
Language string `json:"language"`
License License `json:"license"`
MasterBranch string `json:"master_branch"`
Name string `json:"name"`
OpenIssuesCount int `json:"open_issues_count"`
Owner User `json:"owner"`
PushedAt time.Time `json:"pushed_at"`
Size int `json:"size"`
StargazersCount int `json:"stargazers_count"`
URL string `json:"html_url"`
UpdatedAt time.Time `json:"updated_at"`
Visibility string `json:"visibility"`
WatchersCount int `json:"watchers_count"`
}
type License struct {
Key string `json:"key"`
Name string `json:"name"`
URL string `json:"url"`
}
type User struct {
GravatarID string `json:"gravatar_id"`
ID string `json:"node_id"`
Login string `json:"login"`
SiteAdmin bool `json:"site_admin"`
Type string `json:"type"`
URL string `json:"html_url"`
}
type Issue struct {
Assignees []User `json:"assignees"`
Author User `json:"user"`
AuthorAssociation string `json:"author_association"`
Body string `json:"body"`
ClosedAt time.Time `json:"closed_at"`
CommentsCount int `json:"comments"`
CreatedAt time.Time `json:"created_at"`
ID string `json:"node_id"`
Labels []Label `json:"labels"`
IsLocked bool `json:"locked"`
Number int `json:"number"`
PullRequestLinks PullRequestLinks `json:"pull_request"`
RepositoryURL string `json:"repository_url"`
State string `json:"state"`
Title string `json:"title"`
URL string `json:"html_url"`
UpdatedAt time.Time `json:"updated_at"`
}
type PullRequestLinks struct {
URL string `json:"html_url"`
}
type Label struct {
Color string `json:"color"`
Description string `json:"description"`
ID string `json:"node_id"`
Name string `json:"name"`
}
func (repo Repository) ExportData(fields []string) map[string]interface{} {
v := reflect.ValueOf(repo)
data := map[string]interface{}{}
for _, f := range fields {
switch f {
case "license":
data[f] = map[string]interface{}{
"key": repo.License.Key,
"name": repo.License.Name,
"url": repo.License.URL,
}
case "owner":
data[f] = map[string]interface{}{
"id": repo.Owner.ID,
"login": repo.Owner.Login,
"type": repo.Owner.Type,
"url": repo.Owner.URL,
}
default:
sf := fieldByName(v, f)
data[f] = sf.Interface()
}
}
return data
}
func (issue Issue) IsPullRequest() bool {
return issue.PullRequestLinks.URL != ""
}
func (issue Issue) ExportData(fields []string) map[string]interface{} {
v := reflect.ValueOf(issue)
data := map[string]interface{}{}
for _, f := range fields {
switch f {
case "assignees":
assignees := make([]interface{}, 0, len(issue.Assignees))
for _, assignee := range issue.Assignees {
assignees = append(assignees, map[string]interface{}{
"id": assignee.ID,
"login": assignee.Login,
"type": assignee.Type,
})
}
data[f] = assignees
case "author":
data[f] = map[string]interface{}{
"id": issue.Author.ID,
"login": issue.Author.Login,
"type": issue.Author.Type,
}
case "isPullRequest":
data[f] = issue.IsPullRequest()
case "labels":
labels := make([]interface{}, 0, len(issue.Labels))
for _, label := range issue.Labels {
labels = append(labels, map[string]interface{}{
"color": label.Color,
"description": label.Description,
"id": label.ID,
"name": label.Name,
})
}
data[f] = labels
case "repository":
comp := strings.Split(issue.RepositoryURL, "/")
nameWithOwner := strings.Join(comp[len(comp)-2:], "/")
data[f] = map[string]interface{}{
"nameWithOwner": nameWithOwner,
}
default:
sf := fieldByName(v, f)
data[f] = sf.Interface()
}
}
return data
}
func fieldByName(v reflect.Value, field string) reflect.Value {
return v.FieldByNameFunc(func(s string) bool {
return strings.EqualFold(field, s)
})
}