Skip to content

Commit

Permalink
feat: length validator
Browse files Browse the repository at this point in the history
  • Loading branch information
ankithans committed Jun 25, 2021
1 parent b067fa1 commit 78e7f12
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 75 deletions.
14 changes: 9 additions & 5 deletions examples/plugins/date/main.go
@@ -1,6 +1,7 @@
package date

import (
"fmt"
"time"

"github.com/aerogear/charmil/pkg/factory"
Expand All @@ -23,7 +24,7 @@ type Options struct {
func DateCommand() (*cobra.Command, error) {

// Initialize localizer providing the language, locals and format of locals file
loc, err := localize.InitLocalizer(localize.Config{Language: language.English, Path: "examples/plugins/date/locals/en/en.yaml", Format: "yaml"})
loc, err := localize.InitLocalizer(localize.Config{Language: language.English, Path: "examples/plugins/date/locales/en/en.yaml", Format: "yaml"})
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -53,11 +54,14 @@ func DateCommand() (*cobra.Command, error) {
},
}

// default validation provided by validator package
validationErr := validator.Validate(cmd)
if validationErr != nil {
return nil, validationErr
var r validator.Rule = &validator.LengthRule{
Use: validator.Limit{Min: 2, Max: 5},
Short: validator.Limit{Min: 4, Max: 5},
Long: validator.Limit{Min: 5, Max: 20},
Example: validator.Limit{Min: 5, Max: 30},
}
errr := r.Validate(cmd)
fmt.Println(errr)

return cmd, nil
}
97 changes: 97 additions & 0 deletions validator/length.go
@@ -0,0 +1,97 @@
package validator

import (
"fmt"

"github.com/spf13/cobra"
)

type LengthRule struct {
Use Limit
Short Limit
Long Limit
Example Limit
}

type Limit struct {
Min, Max int
}

func (l *LengthRule) Validate(cmd *cobra.Command) []error {

var errors []error
err := validateCobraCommand(cmd, l)
errors = append(errors, err...)

for _, child := range cmd.Commands() {
err := validateCobraCommand(child, l)
errors = append(errors, err...)

}

return errors
}

func validateCobraCommand(cmd *cobra.Command, l *LengthRule) []error {
var errors []error

cmdPath := cmd.CommandPath()

use := cmd.Use
useErr := validateField(l.Use, use, cmdPath)
if useErr != nil {
errors = append(errors, useErr)
}

short := cmd.Short
shortErr := validateField(l.Short, short, cmdPath)
if shortErr != nil {
errors = append(errors, shortErr)
}

long := cmd.Long
longErr := validateField(l.Long, long, cmdPath)
if longErr != nil {
errors = append(errors, longErr)
}

example := cmd.Example
exampleErr := validateField(l.Example, example, cmdPath)
if exampleErr != nil {
errors = append(errors, exampleErr)
}

return errors
}

func validateField(limit Limit, value string, path string) error {
length := len(value)

_, err := isLimitSet(limit)
if err != nil {
return err
}

if length < limit.Min {
return fmt.Errorf("%s in %s: length should be atleast %d", value, path, limit.Min)
}
if length > limit.Max {
return fmt.Errorf("%s in %s: length should be less than %d", value, path, limit.Max)
}

return nil
}

func isLimitSet(limit Limit) (bool, error) {
if limit.Max < 0 || limit.Min < 0 {
return true, fmt.Errorf("max and min must be greater than 0")
}
if limit.Max == 0 && limit.Min == 0 {
return false, fmt.Errorf("limit not set")
}
if limit.Max < limit.Min {
return true, fmt.Errorf("max limit must be greater than min limit")
}

return true, nil
}
70 changes: 0 additions & 70 deletions validator/std_validator.go

This file was deleted.

9 changes: 9 additions & 0 deletions validator/validator.go
@@ -0,0 +1,9 @@
package validator

import (
"github.com/spf13/cobra"
)

type Rule interface {
Validate(cmd *cobra.Command) []error
}

0 comments on commit 78e7f12

Please sign in to comment.