bf9395e022
CI / results (push) Blocked by required conditions
CI / license-header (push) Has been skipped
CI / e2e-dry-run (push) Has been skipped
CI / e2e-live (push) Waiting to run
CI / fast-gate (push) Failing after 0s
Test PR Label Logic / test-pr-labels (push) Failing after 1s
Skill Format Check / check-format (push) Failing after 2s
CI / security (push) Failing after 5s
CI / unit-test (push) Has been skipped
CI / lint (push) Has been skipped
CI / script-test (push) Has been skipped
CI / deterministic-gate (push) Has been skipped
CI / coverage (push) Has been skipped
CI / deadcode (push) Waiting to run
61 lines
1.7 KiB
Go
61 lines
1.7 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package cmd_test
|
|
|
|
import "strings"
|
|
|
|
// Finding kinds.
|
|
const (
|
|
unknownCommand = "unknown_command"
|
|
unknownFlag = "unknown_flag"
|
|
)
|
|
|
|
// finding is a single mismatch between an example command reference and the
|
|
// catalog.
|
|
type finding struct {
|
|
line int
|
|
raw string
|
|
kind string // unknownCommand | unknownFlag
|
|
path string // resolved command path (unknownFlag) or attempted path (unknownCommand)
|
|
flag string // offending flag (unknownFlag only)
|
|
suggest string // nearest known command/flag, "" if none close
|
|
}
|
|
|
|
// checkRefs validates refs against cat and returns all mismatches in order.
|
|
func checkRefs(cat *catalog, refs []ref) []finding {
|
|
var out []finding
|
|
for _, r := range refs {
|
|
path, n, ok := cat.longestPrefix(r.words)
|
|
if !ok {
|
|
attempted := strings.Join(r.words, " ")
|
|
out = append(out, finding{
|
|
line: r.line, raw: r.raw, kind: unknownCommand,
|
|
path: attempted, suggest: cat.suggestCommand(attempted),
|
|
})
|
|
continue
|
|
}
|
|
// Leftover words after a group node are an unknown subcommand (e.g. a
|
|
// mistyped method like "batch_modify_message"). After a leaf they are
|
|
// positionals (e.g. "api GET /path"), so only groups trigger this.
|
|
if n < len(r.words) && cat.isGroup(path) {
|
|
attempted := strings.Join(r.words, " ")
|
|
out = append(out, finding{
|
|
line: r.line, raw: r.raw, kind: unknownCommand,
|
|
path: attempted, suggest: cat.suggestCommand(attempted),
|
|
})
|
|
continue
|
|
}
|
|
for _, f := range r.flags {
|
|
if cat.hasFlag(path, f) {
|
|
continue
|
|
}
|
|
out = append(out, finding{
|
|
line: r.line, raw: r.raw, kind: unknownFlag,
|
|
path: path, flag: f, suggest: cat.suggestFlag(path, f),
|
|
})
|
|
}
|
|
}
|
|
return out
|
|
}
|