Skip to content

Commit

Permalink
Improve error messaging when more args than expected are passed. (#906)
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewsomething authored Oct 29, 2020
1 parent e1ed15f commit 6c0d19a
Show file tree
Hide file tree
Showing 20 changed files with 241 additions and 156 deletions.
10 changes: 6 additions & 4 deletions commands/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,8 +189,9 @@ func isZeroTime(t time.Time) bool {

// RunCmdActionGet runs action get.
func RunCmdActionGet(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}

id, err := strconv.Atoi(c.Args[0])
Expand All @@ -209,8 +210,9 @@ func RunCmdActionGet(c *CmdConfig) error {

// RunCmdActionWait waits for an action to complete or error.
func RunCmdActionWait(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}

id, err := strconv.Atoi(c.Args[0])
Expand Down
10 changes: 6 additions & 4 deletions commands/certificates.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,9 @@ Use `+"`"+`doctl compute certificate list`+"`"+` to see all available certificat

// RunCertificateGet retrieves an existing certificate by its identifier.
func RunCertificateGet(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}
cID := c.Args[0]

Expand Down Expand Up @@ -193,8 +194,9 @@ func RunCertificateList(c *CmdConfig) error {

// RunCertificateDelete deletes a certificate by its identifier.
func RunCertificateDelete(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}
cID := c.Args[0]

Expand Down
7 changes: 4 additions & 3 deletions commands/databases.go
Original file line number Diff line number Diff line change
Expand Up @@ -1110,7 +1110,7 @@ func sqlMode() *Command {
CmdBuilder(cmd, RunDatabaseGetSQLModes, "get <database-id>",
"Get a MySQL database cluster's SQL modes", getSqlModeDesc, Writer,
displayerType(&displayers.DatabaseSQLModes{}), aliasOpt("g"))
setSqlModeDesc := `This command configures the SQL modes for the specified MySQL database cluster. The SQL modes should be provided as a space separated list.
setSqlModeDesc := `This command configures the SQL modes for the specified MySQL database cluster. The SQL modes should be provided as a space separated list.
This will replace the existing SQL mode configuration completely. Include all of the current values when adding a new one.
`
Expand All @@ -1122,8 +1122,9 @@ This will replace the existing SQL mode configuration completely. Include all of

// RunDatabaseGetSQLModes gets the sql modes set on the database
func RunDatabaseGetSQLModes(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}

databaseID := c.Args[0]
Expand Down
30 changes: 18 additions & 12 deletions commands/domains.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,9 @@ func Domain() *Command {

// RunDomainCreate runs domain create.
func RunDomainCreate(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}
domainName := c.Args[0]

Expand Down Expand Up @@ -135,8 +136,9 @@ func RunDomainList(c *CmdConfig) error {

// RunDomainGet retrieves a domain by name.
func RunDomainGet(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}
id := c.Args[0]

Expand All @@ -157,8 +159,9 @@ func RunDomainGet(c *CmdConfig) error {

// RunDomainDelete deletes a domain by name.
func RunDomainDelete(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}
name := c.Args[0]

Expand All @@ -183,8 +186,9 @@ func RunDomainDelete(c *CmdConfig) error {

// RunRecordList list records for a domain.
func RunRecordList(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}
name := c.Args[0]

Expand All @@ -206,8 +210,9 @@ func RunRecordList(c *CmdConfig) error {

// RunRecordCreate creates a domain record.
func RunRecordCreate(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}
name := c.Args[0]

Expand Down Expand Up @@ -324,8 +329,9 @@ func RunRecordDelete(c *CmdConfig) error {

// RunRecordUpdate updates a domain record.
func RunRecordUpdate(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}
domainName := c.Args[0]

Expand Down
85 changes: 51 additions & 34 deletions commands/droplet_actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,9 @@ In order to resize a Droplet, it must first be powered off.`
// RunDropletActionGet returns a droplet action by id.
func RunDropletActionGet(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
dropletID, err := strconv.Atoi(c.Args[0])
if err != nil {
Expand All @@ -190,8 +191,9 @@ func RunDropletActionGet(c *CmdConfig) error {
// RunDropletActionEnableBackups disables backups for a droplet.
func RunDropletActionEnableBackups(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])
if err != nil {
Expand All @@ -208,8 +210,9 @@ func RunDropletActionEnableBackups(c *CmdConfig) error {
// RunDropletActionDisableBackups disables backups for a droplet.
func RunDropletActionDisableBackups(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])
if err != nil {
Expand All @@ -226,8 +229,9 @@ func RunDropletActionDisableBackups(c *CmdConfig) error {
// RunDropletActionReboot reboots a droplet.
func RunDropletActionReboot(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])
if err != nil {
Expand All @@ -244,8 +248,9 @@ func RunDropletActionReboot(c *CmdConfig) error {
// RunDropletActionPowerCycle power cycles a droplet.
func RunDropletActionPowerCycle(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -263,8 +268,9 @@ func RunDropletActionPowerCycle(c *CmdConfig) error {
// RunDropletActionShutdown shuts a droplet down.
func RunDropletActionShutdown(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])
if err != nil {
Expand All @@ -281,8 +287,9 @@ func RunDropletActionShutdown(c *CmdConfig) error {
// RunDropletActionPowerOff turns droplet power off.
func RunDropletActionPowerOff(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -300,8 +307,9 @@ func RunDropletActionPowerOff(c *CmdConfig) error {
// RunDropletActionPowerOn turns droplet power on.
func RunDropletActionPowerOn(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -319,8 +327,9 @@ func RunDropletActionPowerOn(c *CmdConfig) error {
// RunDropletActionPasswordReset resets the droplet root password.
func RunDropletActionPasswordReset(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -338,8 +347,9 @@ func RunDropletActionPasswordReset(c *CmdConfig) error {
// RunDropletActionEnableIPv6 enables IPv6 for a droplet.
func RunDropletActionEnableIPv6(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -357,8 +367,9 @@ func RunDropletActionEnableIPv6(c *CmdConfig) error {
// RunDropletActionEnablePrivateNetworking enables private networking for a droplet.
func RunDropletActionEnablePrivateNetworking(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -376,8 +387,9 @@ func RunDropletActionEnablePrivateNetworking(c *CmdConfig) error {
// RunDropletActionRestore restores a droplet using an image id.
func RunDropletActionRestore(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -401,8 +413,9 @@ func RunDropletActionRestore(c *CmdConfig) error {
// optionally expands the disk.
func RunDropletActionResize(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand Down Expand Up @@ -430,8 +443,9 @@ func RunDropletActionResize(c *CmdConfig) error {
// RunDropletActionRebuild rebuilds a droplet using an image id or slug.
func RunDropletActionRebuild(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand Down Expand Up @@ -459,8 +473,9 @@ func RunDropletActionRebuild(c *CmdConfig) error {
// RunDropletActionRename renames a droplet.
func RunDropletActionRename(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -483,8 +498,9 @@ func RunDropletActionRename(c *CmdConfig) error {
// RunDropletActionChangeKernel changes the kernel for a droplet.
func RunDropletActionChangeKernel(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand All @@ -507,8 +523,9 @@ func RunDropletActionChangeKernel(c *CmdConfig) error {
// RunDropletActionSnapshot creates a snapshot for a droplet.
func RunDropletActionSnapshot(c *CmdConfig) error {
fn := func(das do.DropletActionsService) (*do.Action, error) {
if len(c.Args) != 1 {
return nil, doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return nil, err
}
id, err := strconv.Atoi(c.Args[0])

Expand Down
5 changes: 3 additions & 2 deletions commands/droplets.go
Original file line number Diff line number Diff line change
Expand Up @@ -556,8 +556,9 @@ func matchDroplets(ids []string, ds do.DropletsService, fn matchDropletsFn) erro

// RunDropletGet returns a droplet.
func RunDropletGet(c *CmdConfig) error {
if len(c.Args) != 1 {
return doctl.NewMissingArgsErr(c.NS)
err := ensureOneArg(c)
if err != nil {
return err
}

getTemplate, err := c.Doit.GetString(c.NS, doctl.ArgTemplate)
Expand Down
12 changes: 12 additions & 0 deletions commands/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"fmt"
"os"

"github.com/digitalocean/doctl"
"github.com/fatih/color"
"github.com/shiena/ansicolor"
"github.com/spf13/viper"
Expand Down Expand Up @@ -70,6 +71,17 @@ func checkErr(err error) {
errAction()
}

func ensureOneArg(c *CmdConfig) error {
switch count := len(c.Args); {
case count == 0:
return doctl.NewMissingArgsErr(c.NS)
case count > 1:
return doctl.NewTooManyArgsErr(c.NS)
default:
return nil
}
}

func warn(msg string, args ...interface{}) {
fmt.Fprintf(color.Output, "%s: %s\n", colorWarn, fmt.Sprintf(msg, args...))
}
Expand Down
Loading

0 comments on commit 6c0d19a

Please sign in to comment.