8000 feat(cli): attempt to catch misspelled parameter names · coder/coder@b901ee8 · GitHub
[go: up one dir, main page]

Skip to content

Commit b901ee8

Browse files
committed
feat(cli): attempt to catch misspelled parameter names
1 parent 73b96ef commit b901ee8

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

cli/create_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,31 @@ func TestCreateWithRichParameters(t *testing.T) {
391391
}
392392
<-doneChan
393393
})
394+
395+
t.Run("WrongParameterName/DidYouMean", func(t *testing.T) {
396+
t.Parallel()
397+
398+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
399+
owner := coderdtest.CreateFirstUser(t, client)
400+
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
401+
version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses)
402+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
403+
404+
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)
405+
406+
wrongFirstParameterName := "frst-prameter"
407+
inv, root := clitest.New(t, "create", "my-workspace", "--template", template.Name,
408+
"--parameter", fmt.Sprintf("%s=%s", wrongFirstParameterName, firstParameterValue),
409+
"--parameter", fmt.Sprintf("%s=%s", secondParameterName, secondParameterValue),
410+
"--parameter", fmt.Sprintf("%s=%s", immutableParameterName, immutableParameterValue))
411+
clitest.SetupConfig(t, member, root)
412+
pty := ptytest.New(t).Attach(inv)
413+
inv.Stdout = pty.Output()
414+
inv.Stderr = pty.Output()
415+
err := inv.Run()
416+
assert.ErrorContains(t, err, "parameter \""+wrongFirstParameterName+"\" is not present in the template")
417+
assert.ErrorContains(t, err, "Did you mean: "+firstParameterName)
418+
})
394419
}
395420

396421
func TestCreateValidateRichParameters(t *testing.T) {

cli/parameterresolver.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package cli
22

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

67
"golang.org/x/xerrors"
78

8-
"github.com/coder/pretty"
9-
109
"github.com/coder/coder/v2/cli/clibase"
1110
"github.com/coder/coder/v2/cli/cliui"
11+
"github.com/coder/coder/v2/cli/cliutil/levenshtein"
1212
"github.com/coder/coder/v2/codersdk"
13+
"github.com/coder/pretty"
1314
)
1415

1516
type WorkspaceCLIAction int
@@ -163,7 +164,8 @@ func (pr *ParameterResolver) verifyConstraints(resolved []codersdk.WorkspaceBuil
163164
for _, r := range resolved {
164165
tvp := findTemplateVersionParameter(r, templateVersionParameters)
165166
if tvp == nil {
166-
return xerrors.Errorf("parameter %q is not present in the template", r.Name)
167+
// return xerrors.Errorf("parameter %q is not present in the template", r.Name)
168+
return templateVersionParametersNotFound(r.Name, templateVersionParameters)
167169
}
168170

169171
if tvp.Ephemeral && !pr.promptBuildOptions && findWorkspaceBuildParameter(tvp.Name, pr.buildOptions) == nil {
@@ -254,3 +256,19 @@ func isValidTemplateParameterOption(buildParameter codersdk.WorkspaceBuildParame
254256
}
255257
return false
256258
}
259+
260+
func templateVersionParametersNotFound(unknown string, params []codersdk.TemplateVersionParameter) error {
261+
var sb strings.Builder
262+
_, _ = sb.WriteString(fmt.Sprintf("parameter %q is not present in the template.", unknown))
263+
// Going with a fairly generous edit distance
264+
maxDist := len(unknown) / 2
265+
var paramNames []string
266+
for _, p := range params {
267+
paramNames = append(paramNames, p.Name)
268+
}
269+
matches := levenshtein.Matches(unknown, maxDist, paramNames...)
270+
if len(matches) > 0 {
271+
_, _ = sb.WriteString(fmt.Sprintf("\nDid you mean: %s", strings.Join(matches, ", ")))
272+
}
273+
return xerrors.Errorf(sb.String())
274+
}

0 commit comments

Comments
 (0)
0