@@ -6,37 +6,115 @@ import (
66 "fmt"
77 "io/ioutil"
88 "net/http"
9+ "reflect"
10+ "strings"
911 "time"
1012
1113 "github.com/cli/cli/api"
1214 "github.com/cli/cli/internal/ghinstance"
1315 "github.com/cli/cli/internal/ghrepo"
1416)
1517
18+ var ReleaseFields = []string {
19+ "url" ,
20+ "apiUrl" ,
21+ "uploadUrl" ,
22+ "tarballUrl" ,
23+ "zipballUrl" ,
24+ "id" ,
25+ "tagName" ,
26+ "name" ,
27+ "body" ,
28+ "isDraft" ,
29+ "isPrerelease" ,
30+ "createdAt" ,
31+ "publishedAt" ,
32+ "targetCommitish" ,
33+ "author" ,
34+ "assets" ,
35+ }
36+
1637type Release struct {
17- TagName string `json:"tag_name"`
18- Name string `json:"name"`
19- Body string `json:"body"`
20- IsDraft bool `json:"draft"`
21- IsPrerelease bool `json:"prerelease"`
22- CreatedAt time.Time `json:"created_at"`
23- PublishedAt time.Time `json:"published_at"`
24-
25- APIURL string `json:"url"`
26- UploadURL string `json:"upload_url"`
27- HTMLURL string `json:"html_url"`
28- Assets []ReleaseAsset
38+ ID string `json:"node_id"`
39+ TagName string `json:"tag_name"`
40+ Name string `json:"name"`
41+ Body string `json:"body"`
42+ IsDraft bool `json:"draft"`
43+ IsPrerelease bool `json:"prerelease"`
44+ CreatedAt time.Time `json:"created_at"`
45+ PublishedAt * time.Time `json:"published_at"`
46+
47+ TargetCommitish string `json:"target_commitish"`
48+
49+ APIURL string `json:"url"`
50+ UploadURL string `json:"upload_url"`
51+ TarballURL string `json:"tarball_url"`
52+ ZipballURL string `json:"zipball_url"`
53+ URL string `json:"html_url"`
54+ Assets []ReleaseAsset
2955
3056 Author struct {
31- Login string
57+ ID string `json:"node_id"`
58+ Login string `json:"login"`
3259 }
3360}
3461
3562type ReleaseAsset struct {
63+ ID string `json:"node_id"`
3664 Name string
65+ Label string
3766 Size int64
3867 State string
3968 APIURL string `json:"url"`
69+
70+ CreatedAt time.Time `json:"created_at"`
71+ UpdatedAt time.Time `json:"updated_at"`
72+ DownloadCount int `json:"download_count"`
73+ ContentType string `json:"content_type"`
74+ BrowserDownloadURL string `json:"browser_download_url"`
75+ }
76+
77+ func (rel * Release ) ExportData (fields []string ) * map [string ]interface {} {
78+ v := reflect .ValueOf (rel ).Elem ()
79+ fieldByName := func (v reflect.Value , field string ) reflect.Value {
80+ return v .FieldByNameFunc (func (s string ) bool {
81+ return strings .EqualFold (field , s )
82+ })
83+ }
84+ data := map [string ]interface {}{}
85+
86+ for _ , f := range fields {
87+ switch f {
88+ case "author" :
89+ data [f ] = map [string ]interface {}{
90+ "id" : rel .Author .ID ,
91+ "login" : rel .Author .Login ,
92+ }
93+ case "assets" :
94+ assets := make ([]interface {}, 0 , len (rel .Assets ))
95+ for _ , a := range rel .Assets {
96+ assets = append (assets , map [string ]interface {}{
97+ "url" : a .BrowserDownloadURL ,
98+ "apiUrl" : a .APIURL ,
99+ "id" : a .ID ,
100+ "name" : a .Name ,
101+ "label" : a .Label ,
102+ "size" : a .Size ,
103+ "state" : a .State ,
104+ "createdAt" : a .CreatedAt ,
105+ "updatedAt" : a .UpdatedAt ,
106+ "downloadCount" : a .DownloadCount ,
107+ "contentType" : a .ContentType ,
108+ })
109+ }
110+ data [f ] = assets
111+ default :
112+ sf := fieldByName (v , f )
113+ data [f ] = sf .Interface ()
114+ }
115+ }
116+
117+ return & data
40118}
41119
42120// FetchRelease finds a repository release by its tagName.
0 commit comments