-
Notifications
You must be signed in to change notification settings - Fork 7
/
config.go
138 lines (115 loc) · 2.87 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package utils
import (
"errors"
"io/ioutil"
"os"
"os/user"
"path/filepath"
"strings"
"github.com/AlecAivazis/survey/v2"
"github.com/gookit/color"
"github.com/spf13/viper"
"gopkg.in/yaml.v2"
)
type AirConfig interface {
load() Config
}
// Stations store data related to each station.
type Stations struct {
StationName string `yaml:"stationName,omitempty"`
UID int `yaml:"uid,omitempty"`
SearchQuery string `yaml:"searchQuery,omitempty"`
}
// Config store configuration for the CLI.
type Config struct {
ApiKey string `yaml:"apiKey,omitempty"`
Stations map[string]Stations `yaml:"stations,omitempty"`
}
func (c *Config) UpdateApiKey(newKey string) {
c.ApiKey = newKey
}
func (c *Config) load() error {
err := viper.Unmarshal(&c)
if err != nil {
return err
}
return nil
}
var usr, _ = user.Current()
var ConfigDirPath = filepath.Join(usr.HomeDir, ".air")
var ConfigFilePath = filepath.Join(ConfigDirPath, "aqi")
// CheckConfigDirectory checks if config directory `$HOME/.air` is present.
// If not present, atttempts to create one.
func CheckConfigDirectory() error {
// Create config directory if it does not exist.
if _, err := os.Stat(ConfigDirPath); os.IsNotExist(err) {
if err := os.Mkdir(ConfigDirPath, 0770); err != nil {
return err
}
}
return nil
}
func NewConfig() *Config {
c := &Config{}
return c
}
func CheckConfig(config *Config) error {
err := config.load()
if err != nil {
return errors.New("couldn't read config file")
}
if config.ApiKey == "" {
color.Info.Println("🔑 Get your API key from: https://aqicn.org/data-platform/token/#/")
return errors.New("no API key found, use `air init` to enter")
}
return nil
}
func GetCurrentConfig(config *Config) (*Config, error) {
err := config.load()
if err != nil {
return nil, err
}
stations := config.Stations
updatedStations := make(map[string]Stations)
// viper isn't case sensitive while Unmarshalling. Make keys case sensitive.
if len(stations) >= 1 {
for k, v := range stations {
title := strings.Title(k)
updatedStations[title] = v
}
}
config.Stations = updatedStations
return config, nil
}
// SaveConfig writes new/updated config to the config file.
func SaveConfig(config Config) error {
data, err := yaml.Marshal(&config)
if err != nil {
return err
}
err = writeToFile(ConfigFilePath, data)
if err != nil {
return err
}
return nil
}
func writeToFile(filePath string, data []byte) error {
err := ioutil.WriteFile(filePath, data, 0777)
if err != nil {
return err
}
return nil
}
// ShowSelectionMenu renders the selection menu.
func ShowSelectionMenu(stationNames []string, message string) ([]string, error) {
var selectedStations []string
prompt := &survey.MultiSelect{
Message: message,
Options: stationNames,
}
err := survey.AskOne(prompt, &selectedStations)
if err != nil {
return nil, err
}
return selectedStations, nil
}