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  }