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 }