-
-
Notifications
You must be signed in to change notification settings - Fork 36
/
language_server.go
92 lines (80 loc) · 3.01 KB
/
language_server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Copyright 2024 Princess B33f Heavy Industries / Dave Shanley
// SPDX-License-Identifier: MIT
// https://pb33f.io
package cmd
import (
languageserver "github.com/daveshanley/vacuum/language-server"
"github.com/daveshanley/vacuum/rulesets"
"github.com/daveshanley/vacuum/utils"
"github.com/pterm/pterm"
"github.com/spf13/cobra"
"io"
"log/slog"
"os"
)
func GetLanguageServerCommand() *cobra.Command {
cmd := &cobra.Command{
SilenceErrors: true,
SilenceUsage: true,
Use: "language-server",
Short: "Run a fully compliant LSP server for OpenAPI linting (Language Server Protocol)",
Long: `Provides a fully compliant LSP backend for OpenAPI linting and validation. Connect up your favorite
IDE and start linting your OpenAPI documents in real-time.`,
RunE: func(cmd *cobra.Command, args []string) error {
// setup logging to be discarded, it will invalidate the LSP protocol
handler := pterm.NewSlogHandler(&pterm.Logger{
Writer: io.Discard,
})
logger := slog.New(handler)
// extract flags
rulesetFlag, _ := cmd.Flags().GetString("ruleset")
functionsFlag, _ := cmd.Flags().GetString("functions")
baseFlag, _ := cmd.Flags().GetString("base")
skipCheckFlag, _ := cmd.Flags().GetBool("skip-check")
remoteFlag, _ := cmd.Flags().GetBool("remote")
timeoutFlag, _ := cmd.Flags().GetInt("timeout")
hardModeFlag, _ := cmd.Flags().GetBool("hard-mode")
ignoreArrayCircleRef, _ := cmd.Flags().GetBool("ignore-array-circle-ref")
ignorePolymorphCircleRef, _ := cmd.Flags().GetBool("ignore-array-circle-ref")
defaultRuleSets := rulesets.BuildDefaultRuleSetsWithLogger(logger)
selectedRS := defaultRuleSets.GenerateOpenAPIRecommendedRuleSet()
customFunctions, _ := LoadCustomFunctions(functionsFlag, true)
// HARD MODE
if hardModeFlag {
selectedRS = defaultRuleSets.GenerateOpenAPIDefaultRuleSet()
// extract all OWASP Rules
owaspRules := rulesets.GetAllOWASPRules()
allRules := selectedRS.Rules
for k, v := range owaspRules {
allRules[k] = v
}
}
if rulesetFlag != "" {
rsBytes, rsErr := os.ReadFile(rulesetFlag)
if rsErr != nil {
return rsErr
}
selectedRS, rsErr = BuildRuleSetFromUserSuppliedSet(rsBytes, defaultRuleSets)
if rsErr != nil {
return rsErr
}
}
lfr := utils.LintFileRequest{
BaseFlag: baseFlag,
Remote: remoteFlag,
SkipCheckFlag: skipCheckFlag,
DefaultRuleSets: defaultRuleSets,
SelectedRS: selectedRS,
Functions: customFunctions,
TimeoutFlag: timeoutFlag,
IgnoreArrayCircleRef: ignoreArrayCircleRef,
IgnorePolymorphCircleRef: ignorePolymorphCircleRef,
Logger: logger,
}
return languageserver.NewServer(Version, &lfr).Run()
},
}
cmd.Flags().Bool("ignore-array-circle-ref", false, "Ignore circular array references")
cmd.Flags().Bool("ignore-polymorph-circle-ref", false, "Ignore circular polymorphic references")
return cmd
}