github.com/andrewrech/ih-abstract@v0.0.0-20210322142951-2fec1c8d0f38/config.go (about)

     1  package main
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"strings"
     9  
    10  	"github.com/go-yaml/yaml"
    11  )
    12  
    13  // printConf prints an example SQL database configuration file
    14  func printConf() {
    15  	config := `---
    16  username: username
    17  password: password
    18  host: host
    19  port: 443
    20  database: database
    21  query: SELECT TOP 100 FROM table
    22  ...`
    23  	fmt.Println(config)
    24  }
    25  
    26  // confVars is a struct of configuration variables required for the SQL database connection.
    27  type confVars struct {
    28  	Username string `yaml:"username"`
    29  	Password string `yaml:"password"`
    30  	Host     string `yaml:"host"`
    31  	Port     string `yaml:"port"`
    32  	Database string `yaml:"database"`
    33  	Query    string `yaml:"query"`
    34  }
    35  
    36  // locateDefaultConfig locates the configuration file in $XDG_CONFIG_HOME, $HOME, or the current directory.
    37  func locateDefaultConfig() (config string, err error) {
    38  	defaultConfigDir, defaultConfigDirSet := os.LookupEnv("XDG_CONFIG_HOME")
    39  
    40  	// first check $XDG_CONFIG_HOME
    41  	if defaultConfigDirSet {
    42  		var XDGDirConfig strings.Builder
    43  		XDGDirConfig.WriteString(defaultConfigDir)
    44  		XDGDirConfig.WriteString("/")
    45  		XDGDirConfig.WriteString("ih-abstract")
    46  		XDGDirConfig.WriteString("/")
    47  		XDGDirConfig.WriteString("ih-abstract.yml")
    48  		config = XDGDirConfig.String()
    49  
    50  		if _, err := os.Stat(config); !os.IsNotExist(err) {
    51  			return config, nil
    52  		}
    53  	}
    54  
    55  	// then check $HOME
    56  	homeDir, homeDirSet := os.LookupEnv("HOME")
    57  	if homeDirSet {
    58  		var homeDirConfig strings.Builder
    59  		homeDirConfig.WriteString(homeDir)
    60  		homeDirConfig.WriteString("/")
    61  		homeDirConfig.WriteString(".ih-abstract.yml")
    62  		config = homeDirConfig.String()
    63  
    64  		if _, err := os.Stat(config); !os.IsNotExist(err) {
    65  			return config, nil
    66  		}
    67  
    68  	}
    69  
    70  	// then check the current working directory
    71  	if _, err := os.Stat(".ih-abstract.yml"); !os.IsNotExist(err) {
    72  		return ".ih-abstract.yml", nil
    73  	}
    74  
    75  	return "", errors.New("Cannot locate SQL database configuration file at default locations $XDG_CONFIG_HOME/ih-abstract/ih-abstract.yml, $HOME/.ih-abstract.yml, and ./ih-abstract.yml")
    76  }
    77  
    78  func loadConfig(config string) (vars confVars, err error) {
    79  	y, err := ioutil.ReadFile(config)
    80  	if err != nil {
    81  		return vars, err
    82  	}
    83  
    84  	err = yaml.Unmarshal(y, &vars)
    85  	if err != nil {
    86  		return vars, err
    87  	}
    88  
    89  	return vars, nil
    90  }