package delete import ( "fmt" "strconv" "github.com/MakeNowJust/heredoc" "github.com/cli/cli/v2/pkg/cmd/project/shared/client" "github.com/cli/cli/v2/pkg/cmd/project/shared/queries" "github.com/cli/cli/v2/pkg/cmdutil" "github.com/cli/cli/v2/pkg/iostreams" "github.com/shurcooL/githubv4" "github.com/spf13/cobra" ) type deleteOpts struct { owner string number int32 projectID string exporter cmdutil.Exporter } type deleteConfig struct { client *queries.Client opts deleteOpts io *iostreams.IOStreams } type deleteProjectMutation struct { DeleteProject struct { Project queries.Project `graphql:"projectV2"` } `graphql:"deleteProjectV2(input:$input)"` } func NewCmdDelete(f *cmdutil.Factory, runF func(config deleteConfig) error) *cobra.Command { opts := deleteOpts{} deleteCmd := &cobra.Command{ Short: "Delete a project", Use: "delete []", Example: heredoc.Doc(` # delete the current user's project "1" gh project delete 1 --owner "@me" `), Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { client, err := client.New(f) if err != nil { return err } if len(args) == 1 { num, err := strconv.ParseInt(args[0], 10, 32) if err != nil { return cmdutil.FlagErrorf("invalid number: %v", args[0]) } opts.number = int32(num) } config := deleteConfig{ client: client, opts: opts, io: f.IOStreams, } // allow testing of the command without actually running it if runF != nil { return runF(config) } return runDelete(config) }, } deleteCmd.Flags().StringVar(&opts.owner, "owner", "", "Login of the owner. Use \"@me\" for the current user.") cmdutil.AddFormatFlags(deleteCmd, &opts.exporter) return deleteCmd } func runDelete(config deleteConfig) error { canPrompt := config.io.CanPrompt() owner, err := config.client.NewOwner(canPrompt, config.opts.owner) if err != nil { return err } project, err := config.client.NewProject(canPrompt, owner, config.opts.number, false) if err != nil { return err } config.opts.projectID = project.ID query, variables := deleteItemArgs(config) err = config.client.Mutate("DeleteProject", query, variables) if err != nil { return err } if config.opts.exporter != nil { return config.opts.exporter.Write(config.io, query.DeleteProject.Project) } return printResults(config, query.DeleteProject.Project) } func deleteItemArgs(config deleteConfig) (*deleteProjectMutation, map[string]interface{}) { return &deleteProjectMutation{}, map[string]interface{}{ "input": githubv4.DeleteProjectV2Input{ ProjectID: githubv4.ID(config.opts.projectID), }, "firstItems": githubv4.Int(0), "afterItems": (*githubv4.String)(nil), "firstFields": githubv4.Int(0), "afterFields": (*githubv4.String)(nil), } } func printResults(config deleteConfig, project queries.Project) error { if !config.io.IsStdoutTTY() { return nil } _, err := fmt.Fprintf(config.io.Out, "Deleted project %d\n", project.Number) return err }