xmtop/config.go
2020-02-20 19:26:34 -06:00

120 lines
2.6 KiB
Go

package gotop
import (
"bufio"
"fmt"
"io"
"strconv"
"strings"
"time"
"github.com/xxxserxxx/gotop/colorschemes"
"github.com/xxxserxxx/gotop/widgets"
)
// TODO: test, build, release [#119] [#120] [#121]
type Config struct {
ConfigDir string
LogDir string
LogFile string
GraphHorizontalScale int
HelpVisible bool
Colorscheme colorschemes.Colorscheme
UpdateInterval time.Duration
AverageLoad bool
PercpuLoad bool
Statusbar bool
TempScale widgets.TempScale
NetInterface string
Layout string
MaxLogSize int64
ExportPort string
}
func Parse(in io.Reader, conf *Config) error {
r := bufio.NewScanner(in)
var lineNo int
for r.Scan() {
l := strings.TrimSpace(r.Text())
kv := strings.Split(l, "=")
if len(kv) != 2 {
return fmt.Errorf("bad config file syntax; should be KEY=VALUE, was %s", l)
}
key := strings.ToLower(kv[0])
switch key {
default:
return fmt.Errorf("invalid config option %s", key)
case "configdir":
conf.ConfigDir = kv[1]
case "logdir":
conf.LogDir = kv[1]
case "logfile":
conf.LogFile = kv[1]
case "graphhorizontalscale":
iv, err := strconv.Atoi(kv[1])
if err != nil {
return err
}
conf.GraphHorizontalScale = iv
case "helpvisible":
bv, err := strconv.ParseBool(kv[1])
if err != nil {
return fmt.Errorf("line %d: %v", lineNo, err)
}
conf.HelpVisible = bv
case "colorscheme":
cs, err := colorschemes.FromName(conf.ConfigDir, kv[1])
if err != nil {
return fmt.Errorf("line %d: %v", lineNo, err)
}
conf.Colorscheme = cs
case "updateinterval":
iv, err := strconv.Atoi(kv[1])
if err != nil {
return err
}
conf.UpdateInterval = time.Duration(iv)
case "averagecpu":
bv, err := strconv.ParseBool(kv[1])
if err != nil {
return fmt.Errorf("line %d: %v", lineNo, err)
}
conf.AverageLoad = bv
case "percpuload":
bv, err := strconv.ParseBool(kv[1])
if err != nil {
return fmt.Errorf("line %d: %v", lineNo, err)
}
conf.PercpuLoad = bv
case "tempscale":
iv, err := strconv.Atoi(kv[1])
if err != nil {
return err
}
conf.TempScale = widgets.TempScale(iv)
case "statusbar":
bv, err := strconv.ParseBool(kv[1])
if err != nil {
return fmt.Errorf("line %d: %v", lineNo, err)
}
conf.Statusbar = bv
case "netinterface":
conf.NetInterface = kv[1]
case "layout":
conf.Layout = kv[1]
case "maxlogsize":
iv, err := strconv.Atoi(kv[1])
if err != nil {
return err
}
conf.MaxLogSize = int64(iv)
case "export":
conf.ExportPort = kv[1]
}
}
return nil
}