package cmd import ( "envy/cmd/utils" "errors" "fmt" "os" "path" "github.com/charmbracelet/huh" "github.com/charmbracelet/lipgloss" "github.com/spf13/cobra" ) // deleteCmd represents the delete command var deleteCmd = &cobra.Command{ Use: "delete [environment]", Short: "Delete an environment or the project", Run: func(cmd *cobra.Command, args []string) { isProject, err := cmd.Flags().GetBool("project") utils.StopIfErr(err) env := "" if len(args) > 0 { env = args[0] } envy, err := utils.GetEnvy() utils.StopIfErr(err) project, _ := utils.GetKey(envy, "envy.project") pinned, _ := utils.GetKey(envy, "envy.env") current, _ := utils.GetKey(envy, "envy.current") dbProject, err := utils.GetProject(project) utils.StopIfErr(err) dbEnvs, err := utils.GetEnvironments(dbProject.ID) utils.StopIfErr(err) if isProject || len(dbEnvs) == 1 { var name string var confirm bool style := lipgloss.NewStyle().Foreground(lipgloss.Color("#0FF")) form := huh.NewForm( huh.NewGroup( huh.NewInput(). Title("Delete Project"). Description("Enter \""+style.Render(project)+"\" to proceed"). Validate(func(s string) error { if s != project { return errors.New("wrong project name entered") } return nil }). Value(&name), huh.NewConfirm(). Title("Are you sure that you want to delete this project?"). Description("All the environments, except the current one, will be permanently deleted"). Value(&confirm), ), ) err = form.Run() utils.StopIfErr(err) if confirm { utils.DB.Delete(&dbEnvs) utils.DB.Delete(&dbProject) cwd, err := os.Getwd() utils.StopIfErr(err) err = os.Remove(path.Join(cwd, "envy.toml")) utils.StopIfErr(err) fmt.Printf("Deleted project %v and its environments.\n", project) } } else { dbEnv := &utils.Environment{} if env == "" { form := huh.NewForm( huh.NewGroup( huh.NewSelect[*utils.Environment](). Title("Delete environment"). Description("Select environment to delete"). OptionsFunc(func() []huh.Option[*utils.Environment] { var opts []huh.Option[*utils.Environment] for _, en := range dbEnvs { opts = append(opts, huh.NewOption(en.Name, &en)) } return opts }, &dbEnvs). Validate(func(e *utils.Environment) error { if e.Name == current { return errors.New("cannot delete current environment") } return nil }). Value(&dbEnv), ), ) err = form.Run() utils.StopIfErr(err) } else { for _, en := range dbEnvs { if en.Name == env { dbEnv = &en } } } switch dbEnv.Name { case pinned: envy.Set("envy.env", current) data, err := envy.Marshal() utils.StopIfErr(err) cwd, err := os.Getwd() utils.StopIfErr(err) err = os.WriteFile(path.Join(cwd, "envy.toml"), data, 0755) utils.StopIfErr(err) case current: utils.ErrPrint("Cannot delete current environment.") os.Exit(1) } utils.DB.Delete(&dbEnv) fmt.Printf("Deleted environment %v from project %v.\n", dbEnv.Name, project) } }, } func init() { rootCmd.AddCommand(deleteCmd) deleteCmd.Flags().BoolP("project", "p", false, "Delete the entire project") }