/
config.go
102 lines (84 loc) · 1.59 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
package config
import (
"errors"
"fmt"
"io/ioutil"
"net"
"github.com/BurntSushi/toml"
)
// An MID MUST be 18 digits
const midLength = 18
type confdata struct {
Token string `toml:"token"`
MID string `toml:"mid"`
DarkHours int `toml:"darkhours"`
Hours int `toml:"hours"`
Port int `toml:"port"`
ShellyIP string `toml:"shelly_ip"`
}
type Config struct {
token string
mid string
darkHours int
hours int
port int
shellyIP net.IP
}
var conf Config
func init() {
}
func LoadConfig(filename string) (Config, error) {
err := conf.Load(filename)
return conf, err
}
func GetConf() Config {
return conf
}
func (c Config) Token() string {
return c.token
}
func (c Config) MID() string {
return c.mid
}
func (c Config) IP() net.IP {
return c.shellyIP
}
func (c Config) Port() int {
return c.port
}
func (c Config) Hours() int {
return c.hours
}
func (c Config) DarkHours() int {
return c.darkHours
}
func (c *Config) Load(filename string) error {
tomlData, err := ioutil.ReadFile(filename)
if err != nil {
return fmt.Errorf("%s: %w", filename, err)
}
var d confdata
_, err = toml.Decode(string(tomlData), &d)
if err != nil {
return err
}
c.mid = d.MID
c.token = d.Token
if len(c.mid) != midLength {
return fmt.Errorf("MID is not %d digits", midLength)
}
if c.token == "" {
return errors.New("empty token")
}
c.shellyIP = net.ParseIP(d.ShellyIP)
c.darkHours = defaultValue(d.DarkHours, 3)
c.hours = defaultValue(d.Hours, 12)
c.port = d.Port
return nil
}
func defaultValue(i, d int) int {
if i == 0 {
return d
}
return i
}