Skip to content
This repository has been archived by the owner on Jun 9, 2022. It is now read-only.

Commit

Permalink
use custom cobra args validators
Browse files Browse the repository at this point in the history
  • Loading branch information
martinnirtl committed Feb 24, 2020
1 parent 0b7a429 commit 65dd760
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 128 deletions.
13 changes: 11 additions & 2 deletions internal/commands/argsvalidator/argsvalidator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (

"github.com/martinnirtl/dockma/internal/config"
"github.com/martinnirtl/dockma/internal/utils"
"github.com/martinnirtl/dockma/internal/utils/helpers"
"github.com/martinnirtl/dockma/pkg/dockercompose"
"github.com/spf13/cobra"
"github.com/ttacon/chalk"
)
Expand Down Expand Up @@ -71,10 +71,19 @@ func OnlyServices(cmd *cobra.Command, args []string) error {
activeEnv := config.GetActiveEnv()

for _, arg := range args {
if !utils.Includes(helpers.GetEnvServices(activeEnv), arg) {
if !utils.Includes(getEnvServices(activeEnv), arg) {
return fmt.Errorf("No such environment %s", chalk.Underline.TextStyle(arg))
}
}

return nil
}

func getEnvServices(env config.Env) []string {
envHomeDir := env.GetHomeDir()

services, err := dockercompose.GetServices(envHomeDir)
utils.ErrorAndExit(err)

return services.All
}
12 changes: 7 additions & 5 deletions internal/commands/envcmd/pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ import (
"fmt"
"os"

"github.com/martinnirtl/dockma/internal/commands/argsvalidator"
"github.com/martinnirtl/dockma/internal/config"
"github.com/martinnirtl/dockma/internal/survey"
"github.com/martinnirtl/dockma/internal/utils"
"github.com/martinnirtl/dockma/internal/utils/helpers"
"github.com/martinnirtl/dockma/pkg/externalcommand"
"github.com/martinnirtl/dockma/pkg/externalcommand/spinnertimebridger"
"github.com/spf13/cobra"
Expand All @@ -16,21 +17,22 @@ import (

func getPullCommand() *cobra.Command {
return &cobra.Command{
Use: "pull",
Use: "pull [env]",
Short: "Run 'git pull' in environment home dir",
Long: "Run 'git pull' in environment home dir",
Example: "dockma env pull",
Args: cobra.RangeArgs(0, 1),
Args: argsvalidator.OptionalEnv,
Run: runPullCommand,
}
}

func runPullCommand(cmd *cobra.Command, args []string) {
envName := ""
if len(args) == 0 {
envName = helpers.GetEnvironment("")
envNames := config.GetEnvNames()
envName = survey.Select("Choose an environment", envNames)
} else {
envName = helpers.GetEnvironment(args[0])
envName = args[0]
}

env, err := config.GetEnv(envName)
Expand Down
26 changes: 13 additions & 13 deletions internal/commands/envcmd/remove.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import (
"errors"
"fmt"

"github.com/martinnirtl/dockma/internal/commands/argsvalidator"
"github.com/martinnirtl/dockma/internal/config"
"github.com/martinnirtl/dockma/internal/survey"
"github.com/martinnirtl/dockma/internal/utils"
"github.com/martinnirtl/dockma/internal/utils/helpers"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/ttacon/chalk"
Expand All @@ -19,36 +19,36 @@ func getRemoveCommand() *cobra.Command {
Aliases: []string{"rm"},
Short: "Remove environment",
Long: "Remove environment",
Example: "dockma envs remove my-env",
// FIXME rewrite/rethink loading of dockma config for dynamic generation of ValidArgs
Args: cobra.RangeArgs(0, 1),
Run: runRemoveCommand,
Example: "dockma envs remove",
Args: argsvalidator.OptionalEnv,
Run: runRemoveCommand,
}
}

func runRemoveCommand(cmd *cobra.Command, args []string) {
env := ""
var envName string
if len(args) == 0 {
env = helpers.GetEnvironment("")
envNames := config.GetEnvNames()
envName = survey.Select("Choose an environment", envNames)
} else {
env = helpers.GetEnvironment(args[0])
envName = args[0]
}

sure := survey.Confirm(fmt.Sprintf("Are you sure to remove '%s'", env), false)
sure := survey.Confirm(fmt.Sprintf("Are you sure to remove %s", chalk.Cyan.Color(envName)), false)
if !sure {
utils.Abort()
}

activeEnv := config.GetActiveEnv()

if env == activeEnv.GetName() {
if envName == activeEnv.GetName() {
viper.Set("active", "-")
config.Save(chalk.Yellow.Color("Unset active environment."), errors.New("Failed to unset active environment"))
}

config.Save(fmt.Sprintf("Removed environment: %s", chalk.Cyan.Color(env)), errors.New("Failed to remove environment"))

envs := viper.GetStringMap("envs")
delete(envs, env)
delete(envs, envName)
viper.Set("envs", envs)

config.Save(fmt.Sprintf("Removed environment: %s", chalk.Cyan.Color(envName)), errors.New("Failed to remove environment"))
}
21 changes: 11 additions & 10 deletions internal/commands/envcmd/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ package envcmd
import (
"fmt"

"github.com/martinnirtl/dockma/internal/commands/argsvalidator"
"github.com/martinnirtl/dockma/internal/config"
"github.com/martinnirtl/dockma/internal/survey"
"github.com/martinnirtl/dockma/internal/utils"
"github.com/martinnirtl/dockma/internal/utils/helpers"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/ttacon/chalk"
Expand All @@ -17,23 +18,23 @@ func getSetCommand() *cobra.Command {
Short: "Set active environment",
Long: "Set active environment",
Example: "dockma envs set",
// FIXME loading of viper config for dynamic ValidArgs
Args: cobra.RangeArgs(0, 1),
Run: runSetCommand,
Args: argsvalidator.OptionalEnv,
Run: runSetCommand,
}
}

func runSetCommand(cmd *cobra.Command, args []string) {
env := ""
envName := ""
if len(args) == 0 {
env = helpers.GetEnvironment("")
envNames := config.GetEnvNames()
envName = survey.Select("Choose an environment", envNames)
} else {
env = helpers.GetEnvironment(args[0])
envName = args[0]
}

activeEnv := config.GetActiveEnv()

if env == activeEnv.GetName() {
if envName == activeEnv.GetName() {
fmt.Printf("Environment already set active: %s\n", chalk.Cyan.Color(activeEnv.GetName()))

return
Expand All @@ -43,8 +44,8 @@ func runSetCommand(cmd *cobra.Command, args []string) {
utils.Warn(fmt.Sprintf("Switching from running environment."))
}

viper.Set("active", env)
viper.Set("active", envName)

config.Save(fmt.Sprintf("New active environment: %s (old: %s)", chalk.Cyan.Color(env), activeEnv.GetName()), fmt.Errorf("Failed to set active environment"))
config.Save(fmt.Sprintf("New active environment: %s (old: %s)", chalk.Cyan.Color(envName), activeEnv.GetName()), fmt.Errorf("Failed to set active environment"))

}
24 changes: 4 additions & 20 deletions internal/commands/logscmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"os"
"sort"

"github.com/martinnirtl/dockma/internal/commands/argsvalidator"
"github.com/martinnirtl/dockma/internal/config"
"github.com/martinnirtl/dockma/internal/utils"
"github.com/martinnirtl/dockma/pkg/externalcommand"
Expand All @@ -21,11 +22,9 @@ func GetLogsCommand() *cobra.Command {
Use: "logs [service...]",
Short: "Logs output of all or only selected services",
Long: "Logs output of all or only selected services",
Example: "dockma logs -f my-service",
Args: cobra.ArbitraryArgs,
// Args: cobra.OnlyValidArgs, // TODO investigate
// ValidArgs: getValidArgs(),
Run: runLogsCommand,
Example: "dockma logs -f database",
Args: argsvalidator.OnlyServices,
Run: runLogsCommand,
}

logsCommand.Flags().BoolVarP(&followFlag, "follow", "f", false, "follow log output")
Expand Down Expand Up @@ -73,18 +72,3 @@ func addFlagsToArgs(args []string) []string {

return args
}

// func getValidArgs() []string {
// activeEnv := config.GetActiveEnv()

// if activeEnv == "-" {
// return []string{}
// }

// envHomeDir := config.GetEnvHomeDir(activeEnv)

// services, err := dockercompose.GetServices(envHomeDir)
// utils.ErrorAndExit(err)

// return services.All
// }
46 changes: 18 additions & 28 deletions internal/commands/profilecmd/delete.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package profilecmd

import (
"errors"
"fmt"
"os"

"github.com/martinnirtl/dockma/internal/commands/argsvalidator"
"github.com/martinnirtl/dockma/internal/config"
"github.com/martinnirtl/dockma/internal/survey"
"github.com/martinnirtl/dockma/internal/utils"
Expand All @@ -15,25 +15,13 @@ import (

func getDeleteCommand() *cobra.Command {
return &cobra.Command{
Use: "delete",
Use: "delete [profiles...]",
Aliases: []string{"del"},
Short: "Delete a profile of active environment",
Long: "Delete a profile of active environment",
Example: "dockma profile delete",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) == 1 && !config.GetActiveEnv().HasProfile(args[0]) {
return fmt.Errorf("No such profile: %s", args[0])
}

if len(args) > 1 {
return errors.New("Command only takes one argument")
}

return nil
},
// Args: cobra.OnlyValidArgs,
// ValidArgs: config.GetActiveEnv().GetProfileNames(),
Run: runDeleteCommand,
Args: argsvalidator.OnlyProfiles,
Run: runDeleteCommand,
}
}

Expand All @@ -47,23 +35,25 @@ func runDeleteCommand(cmd *cobra.Command, args []string) {
os.Exit(0)
}

var profileName string
var selected []string
if len(args) == 0 {
profileName = survey.Select("Select profile to be deleted", profileNames)
selected = survey.MultiSelect("Select profiles to be deleted", profileNames, nil)
} else {
profileName = args[0]

proceed := survey.Confirm("Are you sure", true)
if !proceed {
utils.Abort()
}
selected = args
}

profileMap := viper.GetStringMap(fmt.Sprintf("envs.%s.profiles", activeEnv.GetName()))
proceed := survey.Confirm("Are you sure", true)
if !proceed {
utils.Abort()
}

profileMap[profileName] = nil
activeEnvName := activeEnv.GetName()
profileMap := viper.GetStringMap(fmt.Sprintf("envs.%s.profiles", activeEnvName))
for _, profileName := range selected {
profileMap[profileName] = nil

viper.Set(fmt.Sprintf("envs.%s.profiles", activeEnv.GetName()), profileMap)
config.Save(fmt.Sprintf("Deleted profile from %s environment: %s", chalk.Bold.TextStyle(activeEnvName), chalk.Cyan.Color(profileName)), fmt.Errorf("Failed to delete profile: %s", profileName))
}

config.Save(fmt.Sprintf("Deleted profile from %s environment: %s", chalk.Bold.TextStyle(activeEnv.GetName()), chalk.Cyan.Color(profileName)), fmt.Errorf("Failed to delete profile: %s", profileName))
viper.Set(fmt.Sprintf("envs.%s.profiles", activeEnvName), profileMap)
}
17 changes: 4 additions & 13 deletions internal/commands/profilecmd/rename.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"os"

"github.com/martinnirtl/dockma/internal/commands/argsvalidator"
"github.com/martinnirtl/dockma/internal/config"
"github.com/martinnirtl/dockma/internal/survey"
"github.com/martinnirtl/dockma/internal/utils"
Expand All @@ -15,22 +16,12 @@ import (

func getRenameCommand() *cobra.Command {
return &cobra.Command{
Use: "rename",
Use: "rename [profile]",
Short: "Rename profile",
Long: "Rename profile",
Example: "dockma profile rename",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) == 1 && !config.GetActiveEnv().HasProfile(args[0]) {
return fmt.Errorf("No such profile: %s", args[0])
}

if len(args) > 1 {
return errors.New("Command only takes one argument")
}

return nil
},
Run: runRenameCommand,
Args: argsvalidator.OptionalProfile,
Run: runRenameCommand,
}
}

Expand Down
18 changes: 4 additions & 14 deletions internal/commands/profilecmd/update.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package profilecmd

import (
"errors"
"fmt"
"os"

"github.com/martinnirtl/dockma/internal/commands/argsvalidator"
"github.com/martinnirtl/dockma/internal/config"
"github.com/martinnirtl/dockma/internal/survey"
"github.com/martinnirtl/dockma/internal/utils"
Expand All @@ -16,23 +16,13 @@ import (

func getUpdateCommand() *cobra.Command {
return &cobra.Command{
Use: "update",
Use: "update [profile]",
Aliases: []string{"upd"},
Short: "Update profile's service selection",
Long: "Update profile's service selection",
Example: "dockma profile update",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) == 1 && !config.GetActiveEnv().HasProfile(args[0]) {
return fmt.Errorf("No such profile: %s", args[0])
}

if len(args) > 1 {
return errors.New("Command only takes one argument")
}

return nil
},
Run: runUpdateCommand,
Args: argsvalidator.OptionalProfile,
Run: runUpdateCommand,
}
}

Expand Down
Loading

0 comments on commit 65dd760

Please sign in to comment.