Skip to content

Commit 323a047

Browse files
committed
detect and guide when hyphen-prefixed function names mis-parsed as a flags
Signed-off-by: RayyanSeliya <[email protected]>
1 parent 0bc91f3 commit 323a047

File tree

2 files changed

+82
-2
lines changed

2 files changed

+82
-2
lines changed

cmd/create.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,31 @@ EXAMPLES
108108
fmt.Fprintf(os.Stderr, "unable to provide template suggestions: %v", err)
109109
}
110110

111+
// Detect hyphen-prefixed arguments mis-parsed as flags
112+
cmd.SetFlagErrorFunc(func(cmd *cobra.Command, err error) error {
113+
for _, arg := range os.Args[1:] {
114+
if strings.HasPrefix(arg, "--") {
115+
flagName := strings.TrimPrefix(arg, "--")
116+
if cmd.Flags().Lookup(flagName) != nil {
117+
continue
118+
}
119+
if strings.Contains(err.Error(), "unknown flag") && strings.Contains(err.Error(), arg) {
120+
return wrapFlagParsingError(err, arg)
121+
}
122+
} else if strings.HasPrefix(arg, "-") && len(arg) > 1 {
123+
firstChar := string(arg[1])
124+
shortFlag := cmd.Flags().ShorthandLookup(firstChar)
125+
126+
if shortFlag != nil && len(arg) > 2 && strings.Contains(arg, "-") {
127+
return wrapFlagParsingError(err, arg)
128+
} else if strings.Contains(err.Error(), "unknown shorthand flag") && strings.Contains(err.Error(), arg[1:2]) {
129+
return wrapFlagParsingError(err, arg)
130+
}
131+
}
132+
}
133+
return err
134+
})
135+
111136
return cmd
112137
}
113138

@@ -390,7 +415,20 @@ func newInvalidRuntimeError(client *fn.Client, runtime string) error {
390415
for _, v := range runtimes {
391416
fmt.Fprintf(&b, " %v\n", v)
392417
}
393-
return ErrInvalidRuntime(errors.New(b.String()))
418+
419+
baseErr := ErrInvalidRuntime(errors.New(b.String()))
420+
421+
// Check if runtime value indicates mis-parsed function name
422+
for _, arg := range os.Args[1:] {
423+
if strings.HasPrefix(arg, "-") && len(arg) > 2 && strings.Contains(arg[2:], "-") {
424+
if strings.HasPrefix(arg[2:], runtime) || runtime == strings.TrimPrefix(arg, "-"+string(arg[1])) {
425+
flagChar := string(arg[1])
426+
return wrapFlagParsingErrorWithDetails(baseErr, arg, flagChar, runtime)
427+
}
428+
}
429+
}
430+
431+
return baseErr
394432
}
395433

396434
// newInvalidTemplateError creates an error stating that the given template
@@ -407,7 +445,20 @@ func newInvalidTemplateError(client *fn.Client, runtime, template string) error
407445
for _, v := range templates {
408446
fmt.Fprintf(&b, " %v\n", v)
409447
}
410-
return ErrInvalidTemplate(errors.New(b.String()))
448+
449+
baseErr := ErrInvalidTemplate(errors.New(b.String()))
450+
451+
// Check if template value indicates mis-parsed function name
452+
for _, arg := range os.Args[1:] {
453+
if strings.HasPrefix(arg, "-") && len(arg) > 2 && strings.Contains(arg[2:], "-") {
454+
if strings.HasPrefix(arg[2:], template) || template == strings.TrimPrefix(arg, "-"+string(arg[1])) {
455+
flagChar := string(arg[1])
456+
return wrapFlagParsingErrorWithDetails(baseErr, arg, flagChar, template)
457+
}
458+
}
459+
}
460+
461+
return baseErr
411462
}
412463

413464
// prompt the user with value of config members, allowing for interactively

cmd/errors.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cmd
22

33
import (
44
"fmt"
5+
"strings"
56
)
67

78
// wrapNotInitializedError wraps an ErrNotInitialized error with CLI-specific guidance
@@ -96,3 +97,31 @@ For more options, run 'func deploy --help'`, err)
9697
return err
9798
}
9899
}
100+
101+
// wrapFlagParsingError adds DNS-1035 naming guidance to flag parsing errors
102+
func wrapFlagParsingError(err error, suspectedName string) error {
103+
return wrapFlagParsingErrorWithDetails(err, suspectedName, "", "")
104+
}
105+
106+
// wrapFlagParsingErrorWithDetails adds DNS-1035 naming guidance with specific flag details
107+
func wrapFlagParsingErrorWithDetails(err error, suspectedName, flagChar, parsedValue string) error {
108+
var explanation string
109+
if strings.HasPrefix(suspectedName, "--") {
110+
explanation = fmt.Sprintf("It looks like '%s' was interpreted as a long flag.", suspectedName)
111+
} else if len(suspectedName) > 1 && suspectedName[0] == '-' {
112+
if flagChar != "" && parsedValue != "" {
113+
explanation = fmt.Sprintf("It looks like '%s' was interpreted as the flag '-%s' with value '%s'.",
114+
suspectedName, flagChar, parsedValue)
115+
} else {
116+
explanation = fmt.Sprintf("It looks like '%s' was interpreted as a flag.", suspectedName)
117+
}
118+
} else {
119+
return err
120+
}
121+
122+
return fmt.Errorf("%v\n\n"+
123+
"Note: %s\n"+
124+
"Function names cannot start with hyphens per DNS-1035 naming rules.\n"+
125+
"Valid function names must start with a letter (a-z) and can contain letters, numbers, and hyphens.",
126+
err, explanation)
127+
}

0 commit comments

Comments
 (0)