feat: implement delete command

This commit is contained in:
2025-10-02 23:49:24 +05:30
parent 1e4fc8539b
commit 8822a0a8da

138
cmd/delete.go Normal file
View File

@@ -0,0 +1,138 @@
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")
}