github.com/cli/cli@v1.14.1-0.20210902173923-1af6a669e342/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 data[f] = n[0].Commit.StatusCheckRollup.Contexts.Nodes 42 } else { 43 data[f] = nil 44 } 45 case "commits": 46 commits := make([]interface{}, 0, len(pr.Commits.Nodes)) 47 for _, c := range pr.Commits.Nodes { 48 commit := c.Commit 49 authors := make([]interface{}, 0, len(commit.Authors.Nodes)) 50 for _, author := range commit.Authors.Nodes { 51 authors = append(authors, map[string]interface{}{ 52 "name": author.Name, 53 "email": author.Email, 54 "id": author.User.ID, 55 "login": author.User.Login, 56 }) 57 } 58 commits = append(commits, map[string]interface{}{ 59 "oid": commit.OID, 60 "messageHeadline": commit.MessageHeadline, 61 "messageBody": commit.MessageBody, 62 "committedDate": commit.CommittedDate, 63 "authoredDate": commit.AuthoredDate, 64 "authors": authors, 65 }) 66 } 67 data[f] = commits 68 case "comments": 69 data[f] = pr.Comments.Nodes 70 case "assignees": 71 data[f] = pr.Assignees.Nodes 72 case "labels": 73 data[f] = pr.Labels.Nodes 74 case "projectCards": 75 data[f] = pr.ProjectCards.Nodes 76 case "reviews": 77 data[f] = pr.Reviews.Nodes 78 case "files": 79 data[f] = pr.Files.Nodes 80 case "reviewRequests": 81 requests := make([]interface{}, 0, len(pr.ReviewRequests.Nodes)) 82 for _, req := range pr.ReviewRequests.Nodes { 83 r := req.RequestedReviewer 84 switch r.TypeName { 85 case "User": 86 requests = append(requests, map[string]string{ 87 "__typename": r.TypeName, 88 "login": r.Login, 89 }) 90 case "Team": 91 requests = append(requests, map[string]string{ 92 "__typename": r.TypeName, 93 "name": r.Name, 94 "slug": r.LoginOrSlug(), 95 }) 96 } 97 } 98 data[f] = &requests 99 default: 100 sf := fieldByName(v, f) 101 data[f] = sf.Interface() 102 } 103 } 104 105 return &data 106 } 107 108 func fieldByName(v reflect.Value, field string) reflect.Value { 109 return v.FieldByNameFunc(func(s string) bool { 110 return strings.EqualFold(field, s) 111 }) 112 }