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  }