diff --git a/cmd/create.go b/cmd/create.go index 31629b0..fd4c213 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -32,11 +32,8 @@ var createCmd = &cobra.Command{ return } - project := envy.Get("envy.project").(string) - if project == "" { - utils.ErrPrint("Project name is empty. envy.toml file might have been modified.") - return - } + project, err := utils.GetKey(envy, "envy.project") + utils.StopIfErr(err) dbProject, err := utils.GetProject(project) if err != nil { diff --git a/cmd/list.go b/cmd/list.go index d6a49d1..5356bfc 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -19,9 +19,14 @@ var listCmd = &cobra.Command{ return } - project := envy.Get("envy.project").(string) - pinned := envy.Get("envy.env").(string) - current := envy.Get("envy.current").(string) + project, err := utils.GetKey(envy, "envy.project") + utils.StopIfErr(err) + + pinned, err := utils.GetKey(envy, "envy.pinned") + utils.StopIfErr(err) + + current, err := utils.GetKey(envy, "envy.current") + utils.StopIfErr(err) if project == "" { utils.ErrPrint("Project name is empty. envy.toml file might have been modified.") diff --git a/cmd/pin.go b/cmd/pin.go index 2c53aaf..9c6ed2b 100644 --- a/cmd/pin.go +++ b/cmd/pin.go @@ -27,7 +27,8 @@ var pinCmd = &cobra.Command{ envy, err := utils.GetEnvy() utils.StopIfErr(err) - project := envy.Get("envy.project").(string) + project, err := utils.GetKey(envy, "envy.project") + utils.StopIfErr(err) dbProject, err := utils.GetProject(project) utils.StopIfErr(err) diff --git a/cmd/switch.go b/cmd/switch.go index fd382fa..fb34ab6 100644 --- a/cmd/switch.go +++ b/cmd/switch.go @@ -23,8 +23,11 @@ var switchCmd = &cobra.Command{ envy, err := utils.GetEnvy() utils.StopIfErr(err) - project := envy.Get("envy.project").(string) - current := envy.Get("envy.current").(string) + project, err := utils.GetKey(envy, "envy.project") + utils.StopIfErr(err) + + current, err := utils.GetKey(envy, "envy.current") + utils.StopIfErr(err) dbProject, err := utils.GetProject(project) utils.StopIfErr(err) diff --git a/cmd/update.go b/cmd/update.go new file mode 100644 index 0000000..b315677 --- /dev/null +++ b/cmd/update.go @@ -0,0 +1,62 @@ +package cmd + +import ( + "envy/cmd/utils" + "fmt" + "os" + "path" + + "github.com/spf13/cobra" +) + +// updateCmd represents the update command +var updateCmd = &cobra.Command{ + Use: "update", + Short: "Update the current environment data with the new one", + Run: func(cmd *cobra.Command, args []string) { + envy, err := utils.GetEnvy() + utils.StopIfErr(err) + + project, err := utils.GetKey(envy, "envy.project") + utils.StopIfErr(err) + + current, err := utils.GetKey(envy, "envy.current") + utils.StopIfErr(err) + + projectDb, err := utils.GetProject(project) + utils.StopIfErr(err) + + currentDb, err := utils.GetEnvironment(projectDb.ID, current) + utils.StopIfErr(err) + + cwd, err := os.Getwd() + utils.StopIfErr(err) + + env, err := os.ReadFile(path.Join(cwd, ".env")) + utils.StopIfErr(err) + + if currentDb.Data == utils.ParseEnv(string(env)) { + utils.ErrPrint("No changes found to update.") + return + } + + result := utils.DB.Model(¤tDb).Update("data", utils.ParseEnv(string(env))) + utils.StopIfErr(result.Error) + + fmt.Printf("Updated data for environment %s.\n", current) + }, +} + +func init() { + rootCmd.AddCommand(updateCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // updateCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // updateCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} diff --git a/cmd/utils/other.go b/cmd/utils/other.go index af3fdde..2b80fa7 100644 --- a/cmd/utils/other.go +++ b/cmd/utils/other.go @@ -44,6 +44,18 @@ func GetEnvy() (*toml.Tree, error) { } } +func GetKey(t *toml.Tree, key string) (string, error) { + v := t.Get(key) + if v == nil { + return "", fmt.Errorf("key %v not found", v) + } + s, ok := v.(string) + if !ok { + return "", fmt.Errorf("key %q is %T, expected string", key, v) + } + return s, nil +} + func WriteEnvy(tree *toml.Tree) error { data, err := tree.Marshal() if err != nil {