04f17f8616
ci / vet, staticcheck, test, build (push) Successful in 2m25s
- Added comprehensive table-driven test suites for all packages: cmd/glint, cicontext, fetcher, graph, linter, model, resolver. Coverage reaches 98%+ statement coverage across the codebase. - Replaced os.Exit calls in cmd/glint with an `exit` variable so tests can capture exit codes without terminating the test process. - Removed unreachable code found during coverage analysis: dead guard in cicontext.parseRegexLiteral; dead len(jobs)==0 branch in graph.Pipeline; skipWin struct field and dead continue in graph.convertToPNG; pipelineSVG return type simplified to string. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"sort"
|
|
"strings"
|
|
|
|
"git.k3nny.fr/glint/internal/linter"
|
|
)
|
|
|
|
func cmdExplain(args []string) {
|
|
if len(args) == 0 {
|
|
printRuleList()
|
|
return
|
|
}
|
|
ruleID := strings.ToUpper(args[0])
|
|
entry, ok := linter.RuleCatalog[ruleID]
|
|
if !ok {
|
|
fmt.Fprintf(os.Stderr, "glint explain: unknown rule %q\n\nRun 'glint explain' to list all rules.\n", ruleID)
|
|
exit(2)
|
|
return
|
|
}
|
|
printRuleEntry(ruleID, entry)
|
|
}
|
|
|
|
func printRuleEntry(id string, e linter.RuleEntry) {
|
|
sev := strings.ToLower(string(e.Severity))
|
|
header := fmt.Sprintf("%s [%s] %s", id, sev, e.Title)
|
|
rule := fmt.Sprintf("\n%s\n%s\n\n%s\n",
|
|
header,
|
|
strings.Repeat("─", len(header)),
|
|
e.Description,
|
|
)
|
|
fmt.Print(rule)
|
|
|
|
if e.Example != "" {
|
|
fmt.Println("Example:")
|
|
fmt.Println()
|
|
for _, line := range strings.Split(e.Example, "\n") {
|
|
fmt.Printf(" %s\n", line)
|
|
}
|
|
fmt.Println()
|
|
}
|
|
|
|
if e.Fix != "" {
|
|
fmt.Println("Fix:")
|
|
fmt.Println()
|
|
for _, line := range strings.Split(e.Fix, "\n") {
|
|
fmt.Printf(" %s\n", line)
|
|
}
|
|
fmt.Println()
|
|
}
|
|
}
|
|
|
|
func printRuleList() {
|
|
ids := make([]string, 0, len(linter.RuleCatalog))
|
|
for id := range linter.RuleCatalog {
|
|
ids = append(ids, id)
|
|
}
|
|
sort.Strings(ids)
|
|
|
|
fmt.Printf("glint %s — lint rules\n\n", version)
|
|
for _, id := range ids {
|
|
e := linter.RuleCatalog[id]
|
|
sev := strings.ToLower(string(e.Severity))
|
|
fmt.Printf(" %-6s [%-7s] %s\n", id, sev, e.Title)
|
|
}
|
|
fmt.Println("\nUse 'glint explain <RULE>' for details on a specific rule.")
|
|
}
|