...
1 package vset
2
3 import (
4 "encoding/json"
5 "fmt"
6 "os"
7
8 "edge-infra.dev/pkg/lib/build/bazel"
9 )
10
11
12
13
14 type Configure interface {
15 Configurator(string) error
16 FileAssociations(...interface{}) map[string]interface{}
17 FileWatcherExclude(...interface{}) map[string]interface{}
18 GoAltTools() map[string]string
19 GoLintFlags() []string
20 Gopls(...interface{}) map[string]interface{}
21 JSONConfig(...interface{}) map[string]interface{}
22 StarlarkConfig(...interface{}) map[string]interface{}
23 }
24
25 func Configurator(path, goLintPath string) error {
26 byteValue, err := os.ReadFile(path)
27 if err != nil {
28 return fmt.Errorf("failed to read existing settings.json: %w", err)
29 }
30
31 var settingsMap map[string]interface{}
32 if err = json.Unmarshal(byteValue, &settingsMap); err != nil {
33 return fmt.Errorf("failed to unmarshal json, confirm that your settings.json is free of syntax errors: %w", err)
34 }
35
36
37 settingsMap["[json]"] = JSONConfig(settingsMap["[json]"])
38 settingsMap["[starlark]"] = StarlarkConfig(settingsMap["[starlark]"])
39 settingsMap["bazel.buildifierFixOnFormat"] = true
40 settingsMap["files.associations"] = FileAssociations(settingsMap["files.associations"])
41 settingsMap["files.watcherExclude"] = FileWatcherExclude(settingsMap["files.watcherExclude"])
42 settingsMap["go.lintFlags"] = GoLintFlags(goLintPath)
43 settingsMap["go.lintOnSave"] = "package"
44 settingsMap["go.lintTool"] = "golangci-lint"
45 settingsMap["go.useLanguageServer"] = true
46 settingsMap["gopls"] = Gopls(settingsMap["gopls"])
47 settingsMap["go.alternateTools"], err = GoAltTools()
48 if err != nil {
49 return err
50 }
51
52
53 byteValue, err = json.MarshalIndent(settingsMap, "", " ")
54 if err != nil {
55 return fmt.Errorf("failed to marshal json: %w", err)
56 }
57 if err = os.WriteFile(path, byteValue, 0644); err != nil {
58 return fmt.Errorf("failed to rewrite settings.json: %w", err)
59 }
60 fmt.Println("...settings.json configured successfully!")
61 fmt.Println("For more customization, see https://github.com/golang/vscode-go/blob/master/docs/settings.md")
62 fmt.Println("Exiting...")
63 return nil
64 }
65
66 func FileAssociations(fileSet ...interface{}) map[string]interface{} {
67 fileMap := make(map[string]interface{})
68 if fileSet[0] != nil {
69 fileMap = fileSet[0].(map[string]interface{})
70 }
71 fileMap[".warehouse-dist/**/*"] = "json"
72 return fileMap
73 }
74
75 func FileWatcherExclude(excludeSet ...interface{}) map[string]interface{} {
76 excludeMap := make(map[string]interface{})
77 if excludeSet[0] != nil {
78 excludeMap = excludeSet[0].(map[string]interface{})
79 }
80 excludeMap["**/.git/objects/**"] = true
81 excludeMap["**/.git/subtree-cache/**"] = true
82 excludeMap["**/.warehouse-dist/**"] = true
83 excludeMap["**/node_modules/*/**"] = true
84 excludeMap["**/bazel-bin/*/**"] = true
85 excludeMap["**/bazel-edge-infra/*/**"] = true
86 excludeMap["**/bazel-out/*/**"] = true
87 excludeMap["**/bazel-testlogs/*/**"] = true
88 return excludeMap
89 }
90
91 func GoAltTools() (map[string]string, error) {
92 goPath, err := bazel.FindRepoRoot(path)
93 if err != nil {
94 return nil, fmt.Errorf("failed to find repo root: %w", err)
95 }
96 goPath += "/bazel-edge-infra/external/go_sdk/bin/go"
97 return map[string]string{
98 "go": goPath,
99 }, nil
100 }
101
102 func GoLintFlags(goLintPath string) []string {
103 return []string{
104 "--fast",
105 "-c",
106 goLintPath + "hack/tools/linters/golangcilint.yaml",
107 }
108 }
109
110 func Gopls(goplsSet ...interface{}) map[string]interface{} {
111 goplsMap := make(map[string]interface{})
112 if goplsSet[0] != nil {
113 goplsMap = goplsSet[0].(map[string]interface{})
114 }
115 goplsMap["build.directoryFilters"] = []string{
116 "-bazel-bin",
117 "-bazel-edge-infra",
118 "-bazel-out",
119 "-bazel-testlogs",
120 }
121 goplsMap["formatting.local"] = "edge-infra.dev"
122
123 if _, exists := goplsMap["build.experimentalWorkspaceModule"]; exists {
124 fmt.Println("WARNING: gopls:build.experimentalWorkspaceModule can be problematic and has been deleted.")
125 delete(goplsMap, "build.experimentalWorkspaceModule")
126 }
127 return goplsMap
128 }
129
130 func JSONConfig(jsonSet ...interface{}) map[string]interface{} {
131 jsonMap := make(map[string]interface{})
132 if jsonSet[0] != nil {
133 jsonMap = jsonSet[0].(map[string]interface{})
134 }
135 jsonMap["editor.formatOnSave"] = true
136 jsonMap["editor.defaultFormatter"] = "vscode.json-language-features"
137 return jsonMap
138 }
139
140 func StarlarkConfig(starlarkSet ...interface{}) map[string]interface{} {
141 starlarkMap := make(map[string]interface{})
142 if starlarkSet[0] != nil {
143 starlarkMap = starlarkSet[0].(map[string]interface{})
144 }
145 starlarkMap["editor.formatOnSave"] = true
146 starlarkMap["editor.tabSize"] = 4
147 return starlarkMap
148 }
149
View as plain text