...

Source file src/edge-infra.dev/pkg/tools/vset/configure.go

Documentation: edge-infra.dev/pkg/tools/vset

     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  // The Configure interface contains Configurator(), which guides the file through the configuration functions.
    12  // Each configuration function sets its respective field of settings.json to the desired value.
    13  // Fields that require structs as values have struct declarations in structs.go.
    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  	// Settings.json is Unmarshaled into settingsMap to be configured.
    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  	// Update settingsMap to reflect the correct settings for each field.
    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  	// After configuration is complete, convert settingsMap back to json and write it to settings.json.
    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  	// Delete problematic personal configs if present
   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