//go:build mage package main import ( "encoding/json" "fmt" "os" "path/filepath" "strings" ) type config struct { ApplicationConfigurations []string `json:"applicationConfigurations"` BashProfile configBashProfile `json:"bashProfile"` Directories configDirectories `json:"directories"` Git configGit `json:"git"` } type configDirectories struct { UseDefaultDirectories bool `json:"useDefaultDirectories"` IncludeXDGDirectories bool `json:"includeXDGDirectories"` AdditionalDirectories []string `json:"additionalDirectories"` } type configGit struct { GpgSign bool `json:"gpgSign"` User configGitUser `json:"user"` } type configGitUser struct { Email string `json:"email"` Name string `json:"name"` SigningKey string `json:"signingKey"` } type configBashProfile struct { Manage bool `json:"manage"` SessionPaths []configBashProfileSessionPath `json:"sessionPaths"` XdgDirectories map[string]string `json:"xdgDirectories"` EnvironmentVariables map[string]string `json:"environmentVariables"` Aliases map[string]string `json:"aliases"` Commands []configBashProfileCommand `json:"commands"` } type configBashProfileSessionPath struct { Path string `json:"path"` Description string `json:"description"` } type configBashProfileCommand struct { Command string `json:"command"` Description string `json:"description"` } func newConfig() (config, error) { cfg := defaultConfig() path, err := configFilePath() if err != nil { return config{}, fmt.Errorf("unable to calculate the config file path: %w", err) } file, err := os.Open(path) if err != nil { return config{}, fmt.Errorf("unable to open the file: %w", err) } defer file.Close() if err = json.NewDecoder(file).Decode(&cfg); err != nil { return config{}, fmt.Errorf("unable to decode the JSON file: %w", err) } return cfg, nil } func configFilePath() (string, error) { hostname, err := os.Hostname() if err != nil { return "", fmt.Errorf("unable to get the machine's hostname: %w", err) } hostnameParts := strings.SplitN(hostname, "-", 3) if len(hostnameParts) != 3 { return "", fmt.Errorf("unexpected hostname format") } identifier := hostnameParts[1] return filepath.Join(configDir, identifier+".json"), nil } func defaultConfig() config { return config{ Directories: configDirectories{ UseDefaultDirectories: true, IncludeXDGDirectories: true, AdditionalDirectories: []string{}, }, Git: configGit{ GpgSign: false, User: configGitUser{ Email: "", Name: "", SigningKey: "", }, }, ApplicationConfigurations: []string{}, } }