github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/api/export_pr.go (about) 1 package api 2 3 import ( 4 "reflect" 5 "strings" 6 ) 7 8 func (issue *Issue) ExportData(fields []string) map[string]interface{} { 9 v := reflect.ValueOf(issue).Elem() 10 data := map[string]interface{}{} 11 12 for _, f := range fields { 13 switch f { 14 case "comments": 15 data[f] = issue.Comments.Nodes 16 case "assignees": 17 data[f] = issue.Assignees.Nodes 18 case "labels": 19 data[f] = issue.Labels.Nodes 20 case "projectCards": 21 data[f] = issue.ProjectCards.Nodes 22 default: 23 sf := fieldByName(v, f) 24 data[f] = sf.Interface() 25 } 26 } 27 28 return data 29 } 30 31 func (pr *PullRequest) ExportData(fields []string) map[string]interface{} { 32 v := reflect.ValueOf(pr).Elem() 33 data := map[string]interface{}{} 34 35 for _, f := range fields { 36 switch f { 37 case "headRepository": 38 data[f] = pr.HeadRepository 39 case "statusCheckRollup": 40 if n := pr.StatusCheckRollup.Nodes; len(n) > 0 { 41 checks := make([]interface{}, 0, len(n[0].Commit.StatusCheckRollup.Contexts.Nodes)) 42 for _, c := range n[0].Commit.StatusCheckRollup.Contexts.Nodes { 43 if c.TypeName == "CheckRun" { 44 checks = append(checks, map[string]interface{}{ 45 "__typename": c.TypeName, 46 "name": c.Name, 47 "workflowName": c.CheckSuite.WorkflowRun.Workflow.Name, 48 "status": c.Status, 49 "conclusion": c.Conclusion, 50 "startedAt": c.StartedAt, 51 "completedAt": c.CompletedAt, 52 "detailsUrl": c.DetailsURL, 53 }) 54 } else { 55 checks = append(checks, map[string]interface{}{ 56 "__typename": c.TypeName, 57 "context": c.Context, 58 "state": c.State, 59 "targetUrl": c.TargetURL, 60 "startedAt": c.CreatedAt, 61 }) 62 } 63 } 64 data[f] = checks 65 } else { 66 data[f] = nil 67 } 68 case "commits": 69 commits := make([]interface{}, 0, len(pr.Commits.Nodes)) 70 for _, c := range pr.Commits.Nodes { 71 commit := c.Commit 72 authors := make([]interface{}, 0, len(commit.Authors.Nodes)) 73 for _, author := range commit.Authors.Nodes { 74 authors = append(authors, map[string]interface{}{ 75 "name": author.Name, 76 "email": author.Email, 77 "id": author.User.ID, 78 "login": author.User.Login, 79 }) 80 } 81 commits = append(commits, map[string]interface{}{ 82 "oid": commit.OID, 83 "messageHeadline": commit.MessageHeadline, 84 "messageBody": commit.MessageBody, 85 "committedDate": commit.CommittedDate, 86 "authoredDate": commit.AuthoredDate, 87 "authors": authors, 88 }) 89 } 90 data[f] = commits 91 case "comments": 92 data[f] = pr.Comments.Nodes 93 case "assignees": 94 data[f] = pr.Assignees.Nodes 95 case "labels": 96 data[f] = pr.Labels.Nodes 97 case "projectCards": 98 data[f] = pr.ProjectCards.Nodes 99 case "reviews": 100 data[f] = pr.Reviews.Nodes 101 case "latestReviews": 102 data[f] = pr.LatestReviews.Nodes 103 case "files": 104 data[f] = pr.Files.Nodes 105 case "reviewRequests": 106 requests := make([]interface{}, 0, len(pr.ReviewRequests.Nodes)) 107 for _, req := range pr.ReviewRequests.Nodes { 108 r := req.RequestedReviewer 109 switch r.TypeName { 110 case "User": 111 requests = append(requests, map[string]string{ 112 "__typename": r.TypeName, 113 "login": r.Login, 114 }) 115 case "Team": 116 requests = append(requests, map[string]string{ 117 "__typename": r.TypeName, 118 "name": r.Name, 119 "slug": r.LoginOrSlug(), 120 }) 121 } 122 } 123 data[f] = &requests 124 default: 125 sf := fieldByName(v, f) 126 data[f] = sf.Interface() 127 } 128 } 129 130 return data 131 } 132 133 func fieldByName(v reflect.Value, field string) reflect.Value { 134 return v.FieldByNameFunc(func(s string) bool { 135 return strings.EqualFold(field, s) 136 }) 137 }