bloat/config/config.go

138 lines
2.7 KiB
Go
Raw Permalink Normal View History

2019-12-13 18:08:26 +00:00
package config
import (
"bufio"
"errors"
"io"
"os"
"strings"
2020-01-01 15:58:27 +00:00
"bloat/model"
2019-12-13 18:08:26 +00:00
)
type config struct {
2020-04-19 08:18:36 +00:00
ListenAddress string
ClientName string
ClientScope string
ClientWebsite string
SingleInstance string
StaticDirectory string
TemplatesPath string
DatabasePath string
CustomCSS string
PostFormats []model.PostFormat
LogFile string
2019-12-13 18:08:26 +00:00
}
func (c *config) IsValid() bool {
if len(c.ListenAddress) < 1 ||
len(c.ClientName) < 1 ||
len(c.ClientScope) < 1 ||
len(c.ClientWebsite) < 1 ||
len(c.StaticDirectory) < 1 ||
2020-01-28 20:49:58 +00:00
len(c.TemplatesPath) < 1 ||
2019-12-13 18:08:26 +00:00
len(c.DatabasePath) < 1 {
return false
}
return true
}
func Parse(r io.Reader) (c *config, err error) {
2020-01-28 20:49:58 +00:00
c = new(config)
2019-12-13 18:08:26 +00:00
scanner := bufio.NewScanner(r)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if len(line) < 1 {
continue
}
index := strings.IndexRune(line, '#')
if index == 0 {
continue
}
index = strings.IndexRune(line, '=')
if index < 1 {
return nil, errors.New("invalid config key")
}
key := strings.TrimSpace(line[:index])
val := strings.TrimSpace(line[index+1 : len(line)])
switch key {
case "listen_address":
c.ListenAddress = val
case "client_name":
c.ClientName = val
case "client_scope":
c.ClientScope = val
case "client_website":
c.ClientWebsite = val
2020-04-19 08:18:36 +00:00
case "single_instance":
c.SingleInstance = val
2019-12-13 18:08:26 +00:00
case "static_directory":
c.StaticDirectory = val
2020-01-28 20:49:58 +00:00
case "templates_path":
c.TemplatesPath = val
2019-12-13 18:08:26 +00:00
case "database_path":
c.DatabasePath = val
case "custom_css":
c.CustomCSS = val
2019-12-26 11:25:29 +00:00
case "post_formats":
vals := strings.Split(val, ",")
var formats []model.PostFormat
for _, v := range vals {
pair := strings.Split(v, ":")
if len(pair) != 2 {
return nil, errors.New("invalid config key " + key)
}
n := strings.TrimSpace(pair[0])
t := strings.TrimSpace(pair[1])
if len(n) < 1 || len(t) < 1 {
return nil, errors.New("invalid config key " + key)
}
formats = append(formats, model.PostFormat{
Name: n,
Type: t,
})
}
c.PostFormats = formats
2020-01-28 20:49:58 +00:00
case "log_file":
c.LogFile = val
2019-12-13 18:08:26 +00:00
default:
return nil, errors.New("invalid config key " + key)
2019-12-13 18:08:26 +00:00
}
}
return
}
func ParseFiles(files []string) (c *config, err error) {
var lastErr error
for _, file := range files {
f, err := os.Open(file)
if err != nil {
lastErr = err
if os.IsNotExist(err) {
continue
}
return nil, err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
lastErr = err
return nil, err
}
if info.IsDir() {
continue
}
return Parse(f)
2019-12-13 18:08:26 +00:00
}
if lastErr == nil {
lastErr = errors.New("invalid config file")
2019-12-13 18:08:26 +00:00
}
return nil, lastErr
2019-12-13 18:08:26 +00:00
}