@@ -12,7 +12,6 @@ import (
1212 "github.com/cli/cli/pkg/iostreams"
1313 "github.com/cli/cli/pkg/prompt"
1414 "github.com/cli/cli/pkg/surveyext"
15- "github.com/cli/cli/utils"
1615)
1716
1817type Action int
@@ -196,7 +195,26 @@ func TitleSurvey(state *IssueMetadataState) error {
196195 return nil
197196}
198197
199- func MetadataSurvey (io * iostreams.IOStreams , client * api.Client , baseRepo ghrepo.Interface , state * IssueMetadataState ) error {
198+ type MetadataFetcher struct {
199+ IO * iostreams.IOStreams
200+ APIClient * api.Client
201+ Repo ghrepo.Interface
202+ State * IssueMetadataState
203+ }
204+
205+ func (mf * MetadataFetcher ) RepoMetadataFetch (input api.RepoMetadataInput ) (* api.RepoMetadataResult , error ) {
206+ mf .IO .StartProgressIndicator ()
207+ metadataResult , err := api .RepoMetadata (mf .APIClient , mf .Repo , input )
208+ mf .IO .StopProgressIndicator ()
209+ mf .State .MetadataResult = metadataResult
210+ return metadataResult , err
211+ }
212+
213+ type RepoMetadataFetcher interface {
214+ RepoMetadataFetch (api.RepoMetadataInput ) (* api.RepoMetadataResult , error )
215+ }
216+
217+ func MetadataSurvey (io * iostreams.IOStreams , baseRepo ghrepo.Interface , fetcher RepoMetadataFetcher , state * IssueMetadataState ) error {
200218 isChosen := func (m string ) bool {
201219 for _ , c := range state .Metadata {
202220 if m == c {
@@ -234,42 +252,32 @@ func MetadataSurvey(io *iostreams.IOStreams, client *api.Client, baseRepo ghrepo
234252 Projects : isChosen ("Projects" ),
235253 Milestones : isChosen ("Milestone" ),
236254 }
237- s := utils .Spinner (io .ErrOut )
238- utils .StartSpinner (s )
239- state .MetadataResult , err = api .RepoMetadata (client , baseRepo , metadataInput )
240- utils .StopSpinner (s )
255+ metadataResult , err := fetcher .RepoMetadataFetch (metadataInput )
241256 if err != nil {
242257 return fmt .Errorf ("error fetching metadata options: %w" , err )
243258 }
244259
245260 var users []string
246- for _ , u := range state . MetadataResult .AssignableUsers {
261+ for _ , u := range metadataResult .AssignableUsers {
247262 users = append (users , u .Login )
248263 }
249264 var teams []string
250- for _ , t := range state . MetadataResult .Teams {
265+ for _ , t := range metadataResult .Teams {
251266 teams = append (teams , fmt .Sprintf ("%s/%s" , baseRepo .RepoOwner (), t .Slug ))
252267 }
253268 var labels []string
254- for _ , l := range state . MetadataResult .Labels {
269+ for _ , l := range metadataResult .Labels {
255270 labels = append (labels , l .Name )
256271 }
257272 var projects []string
258- for _ , l := range state . MetadataResult .Projects {
273+ for _ , l := range metadataResult .Projects {
259274 projects = append (projects , l .Name )
260275 }
261276 milestones := []string {noMilestone }
262- for _ , m := range state . MetadataResult .Milestones {
277+ for _ , m := range metadataResult .Milestones {
263278 milestones = append (milestones , m .Title )
264279 }
265280
266- type metadataValues struct {
267- Reviewers []string
268- Assignees []string
269- Labels []string
270- Projects []string
271- Milestone string
272- }
273281 var mqs []* survey.Question
274282 if isChosen ("Reviewers" ) {
275283 if len (users ) > 0 || len (teams ) > 0 {
@@ -345,17 +353,38 @@ func MetadataSurvey(io *iostreams.IOStreams, client *api.Client, baseRepo ghrepo
345353 fmt .Fprintln (io .ErrOut , "warning: no milestones in the repository" )
346354 }
347355 }
348- values := metadataValues {}
356+
357+ values := struct {
358+ Reviewers []string
359+ Assignees []string
360+ Labels []string
361+ Projects []string
362+ Milestone string
363+ }{}
364+
349365 err = prompt .SurveyAsk (mqs , & values , survey .WithKeepFilter (true ))
350366 if err != nil {
351367 return fmt .Errorf ("could not prompt: %w" , err )
352368 }
353- state .Reviewers = values .Reviewers
354- state .Assignees = values .Assignees
355- state .Labels = values .Labels
356- state .Projects = values .Projects
357- if values .Milestone != "" && values .Milestone != noMilestone {
358- state .Milestones = []string {values .Milestone }
369+
370+ if isChosen ("Reviewers" ) {
371+ state .Reviewers = values .Reviewers
372+ }
373+ if isChosen ("Assignees" ) {
374+ state .Assignees = values .Assignees
375+ }
376+ if isChosen ("Labels" ) {
377+ state .Labels = values .Labels
378+ }
379+ if isChosen ("Projects" ) {
380+ state .Projects = values .Projects
381+ }
382+ if isChosen ("Milestone" ) {
383+ if values .Milestone != "" && values .Milestone != noMilestone {
384+ state .Milestones = []string {values .Milestone }
385+ } else {
386+ state .Milestones = []string {}
387+ }
359388 }
360389
361390 return nil
0 commit comments