Skip to content

Commit 6117fd1

Browse files
committed
add simple default flag validation using internal validator pkg
1 parent 3dd1818 commit 6117fd1

File tree

2 files changed

+87
-19
lines changed

2 files changed

+87
-19
lines changed

flags/defaults/core.go

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import (
55
"fmt"
66
"os"
77
"sort"
8+
"strings"
89

910
homedir "github.com/mitchellh/go-homedir"
11+
"github.com/spf13/cast"
1012
"github.com/spf13/viper"
1113

1214
"github.com/liquidweb/liquidweb-cli/config"
1315
"github.com/liquidweb/liquidweb-cli/utils"
16+
"github.com/liquidweb/liquidweb-cli/validate"
1417
)
1518

1619
var (
@@ -44,8 +47,8 @@ func NagsOn() (err error) {
4447

4548
func GetPermitted() (permitted []string) {
4649
permitted = make([]string, 0, len(permittedFlags))
47-
for flag, val := range permittedFlags {
48-
if !val {
50+
for flag, opts := range permittedFlags {
51+
if enabled, ok := opts["enabled"].(bool); !enabled || !ok {
4952
continue
5053
}
5154
permitted = append(permitted, flag)
@@ -78,7 +81,7 @@ func GetOrNag(flag string) (value interface{}) {
7881
}
7982

8083
func Get(flag string) (value interface{}, err error) {
81-
if err = permittedFlagOrError(flag); err != nil {
84+
if _, err = permittedFlagOrError(flag); err != nil {
8285
return
8386
}
8487

@@ -104,7 +107,13 @@ func GetAll() (all AllFlags, err error) {
104107
}
105108

106109
func Set(flag string, value interface{}) (err error) {
107-
if err = permittedFlagOrError(flag); err != nil {
110+
var validator string
111+
validator, err = permittedFlagOrError(flag)
112+
if err != nil {
113+
return
114+
}
115+
116+
if err = validateFlagValue(validator, value); err != nil {
108117
return
109118
}
110119

@@ -126,7 +135,7 @@ func Set(flag string, value interface{}) (err error) {
126135
}
127136

128137
func Delete(flag string) (err error) {
129-
if err = permittedFlagOrError(flag); err != nil {
138+
if _, err = permittedFlagOrError(flag); err != nil {
130139
return
131140
}
132141

@@ -146,16 +155,46 @@ func Delete(flag string) (err error) {
146155
return
147156
}
148157

149-
func permittedFlagOrError(flag string) (err error) {
158+
func permittedFlagOrError(flag string) (validator string, err error) {
150159
if flag == "" {
151160
err = ErrorInvalidFlagName
152161
return
153162
}
154163

155-
if v, exists := permittedFlags[flag]; !exists || !v {
164+
opts, exists := permittedFlags[flag]
165+
if !exists {
166+
err = fmt.Errorf("%s %w", flag, ErrorForbiddenFlag)
167+
return
168+
}
169+
170+
if v, ok := opts["enabled"].(bool); !ok || !v {
156171
err = fmt.Errorf("%s %w", flag, ErrorForbiddenFlag)
157172
}
158173

174+
validator = cast.ToString(opts["type"])
175+
176+
return
177+
}
178+
179+
func validateFlagValue(validator string, value interface{}) (err error) {
180+
var validateFields map[interface{}]interface{}
181+
182+
if strings.HasSuffix(validator, "Int64") {
183+
validateFields = map[interface{}]interface{}{
184+
cast.ToInt64(value): "PositiveInt64",
185+
}
186+
} else if strings.HasSuffix(validator, "Int") {
187+
validateFields = map[interface{}]interface{}{
188+
cast.ToInt(value): "PositiveInt64",
189+
}
190+
} else if strings.HasSuffix(validator, "String") {
191+
validateFields = map[interface{}]interface{}{
192+
cast.ToString(value): "NonEmptyString",
193+
}
194+
}
195+
196+
err = validate.Validate(validateFields)
197+
159198
return
160199
}
161200

flags/defaults/types.go

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,52 @@ func (self AllFlags) String() string {
2424
return strings.Join(slice[:], "")
2525
}
2626

27-
var permittedFlags = map[string]bool{
27+
var permittedFlags = map[string]map[string]interface{}{
2828
// cloud network vip create
29-
"cloud_network_vip_create_zone": true,
29+
"cloud_network_vip_create_zone": map[string]interface{}{
30+
"enabled": true,
31+
"validator": "PositiveInt64",
32+
},
3033
// cloud private-parent create
31-
"cloud_private-parent_create_config-id": true,
32-
"cloud_private-parent_create_zone": true,
34+
"cloud_private-parent_create_config-id": map[string]interface{}{
35+
"enabled": true,
36+
"type": "PositiveInt64",
37+
},
38+
"cloud_private-parent_create_zone": map[string]interface{}{
39+
"enabled": true,
40+
"type": "PositiveInt64",
41+
},
3342
// cloud server clone
34-
"cloud_server_clone_config-id": true,
43+
"cloud_server_clone_config-id": map[string]interface{}{
44+
"enabled": true,
45+
"type": "PositiveInt64",
46+
},
3547
// cloud server create
36-
"cloud_server_create_zone": true,
37-
"cloud_server_create_template": true,
38-
"cloud_server_create_config-id": true,
48+
"cloud_server_create_zone": map[string]interface{}{
49+
"enabled": true,
50+
"type": "PositiveInt64",
51+
},
52+
"cloud_server_create_template": map[string]interface{}{
53+
"enabled": true,
54+
"type": "NonEmptyString",
55+
},
56+
"cloud_server_create_config-id": map[string]interface{}{
57+
"enabled": true,
58+
"type": "PositiveInt64",
59+
},
3960
// cloud server resize
40-
"cloud_server_resize_config-id": true,
61+
"cloud_server_resize_config-id": map[string]interface{}{
62+
"enabled": true,
63+
"type": "PositiveInt64",
64+
},
4165
// cloud template restore
42-
"cloud_template_restore_template": true,
43-
66+
"cloud_template_restore_template": map[string]interface{}{
67+
"enabled": true,
68+
"type": "NonEmptyString",
69+
},
4470
// network ip-pool create
45-
"network_ip-pool_create_zone": true,
71+
"network_ip-pool_create_zone": map[string]interface{}{
72+
"enabled": true,
73+
"type": "PositiveInt64",
74+
},
4675
}

0 commit comments

Comments
 (0)