Skip to content

Commit 04f4341

Browse files
committed
fix(server): moved email validation into flags package for reusability
1 parent 3319a45 commit 04f4341

4 files changed

Lines changed: 100 additions & 2 deletions

File tree

internal/cmd/server/service-account/attach/attach.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command {
8888

8989
func configureFlags(cmd *cobra.Command) {
9090
cmd.Flags().VarP(flags.UUIDFlag(), serverIdFlag, "s", "Server ID")
91-
cmd.Flags().StringP(serviceAccFlag, "a", "", "Service Account Email")
91+
cmd.Flags().VarP(flags.EmailFlag(), serviceAccFlag, "a", "Service Account Email")
9292
err := flags.MarkFlagsRequired(cmd, serverIdFlag)
9393
cobra.CheckErr(err)
9494
}

internal/cmd/server/service-account/detach/detach.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command {
8888

8989
func configureFlags(cmd *cobra.Command) {
9090
cmd.Flags().VarP(flags.UUIDFlag(), serverIdFlag, "s", "Server id")
91-
cmd.Flags().StringP(serviceAccFlag, "a", "", "Service Account Email")
91+
cmd.Flags().VarP(flags.EmailFlag(), serviceAccFlag, "a", "Service Account Email")
9292
err := flags.MarkFlagsRequired(cmd, serverIdFlag)
9393
cobra.CheckErr(err)
9494
}

internal/pkg/flags/email.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package flags
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/spf13/pflag"
8+
)
9+
10+
type emailFlag struct {
11+
value string
12+
}
13+
14+
// Ensure the implementation satisfies the expected interface
15+
var _ pflag.Value = &emailFlag{}
16+
17+
// EmailFlag returns a flag which must be a valid Email.
18+
func EmailFlag() *emailFlag {
19+
return &emailFlag{}
20+
}
21+
22+
func (f *emailFlag) String() string {
23+
return f.value
24+
}
25+
26+
func (f *emailFlag) Set(value string) error {
27+
isEmail := value != "" && strings.Contains(value, "@")
28+
if !isEmail {
29+
return fmt.Errorf("invalid email address: %s", value)
30+
}
31+
f.value = value
32+
return nil
33+
}
34+
35+
func (f *emailFlag) Type() string {
36+
return "string"
37+
}

internal/pkg/flags/email_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package flags
2+
3+
import (
4+
"testing"
5+
6+
"github.com/spf13/cobra"
7+
)
8+
9+
func TestEmailFlag(t *testing.T) {
10+
tests := []struct {
11+
description string
12+
value string
13+
isValid bool
14+
}{
15+
{
16+
description: "valid",
17+
value: "test@test",
18+
isValid: true,
19+
},
20+
{
21+
description: "empty",
22+
value: "",
23+
isValid: false,
24+
},
25+
{
26+
description: "invalid",
27+
value: "invalid-uuid",
28+
isValid: false,
29+
},
30+
}
31+
32+
for _, tt := range tests {
33+
t.Run(tt.description, func(t *testing.T) {
34+
flag := EmailFlag()
35+
cmd := &cobra.Command{
36+
Use: "test",
37+
RunE: func(_ *cobra.Command, _ []string) error {
38+
return nil
39+
},
40+
}
41+
cmd.Flags().Var(flag, "test-flag", "test")
42+
43+
err := cmd.Flags().Set("test-flag", tt.value)
44+
45+
if !tt.isValid && err == nil {
46+
t.Fatalf("did not fail on invalid input")
47+
}
48+
if !tt.isValid {
49+
return
50+
}
51+
52+
if err != nil {
53+
t.Fatalf("failed on valid input: %v", err)
54+
}
55+
value := FlagToStringValue(nil, cmd, "test-flag")
56+
if value != tt.value {
57+
t.Fatalf("flag did not return set value")
58+
}
59+
})
60+
}
61+
}

0 commit comments

Comments
 (0)