bloat/config/config.go

118 lines
2.3 KiB
Go

package config
import (
"bufio"
"errors"
"io"
"os"
"strings"
)
type config struct {
ListenAddress string
ClientName string
ClientScope string
ClientWebsite string
StaticDirectory string
TemplatesGlobPattern string
DatabasePath string
CustomCSS string
Logfile string
}
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 ||
len(c.TemplatesGlobPattern) < 1 ||
len(c.DatabasePath) < 1 {
return false
}
return true
}
func getDefaultConfig() *config {
return &config{
ListenAddress: ":8080",
ClientName: "web",
ClientScope: "read write follow",
ClientWebsite: "http://localhost:8080",
StaticDirectory: "static",
TemplatesGlobPattern: "templates/*",
DatabasePath: "database.db",
CustomCSS: "",
Logfile: "",
}
}
func Parse(r io.Reader) (c *config, err error) {
c = getDefaultConfig()
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
case "static_directory":
c.StaticDirectory = val
case "templates_glob_pattern":
c.TemplatesGlobPattern = val
case "database_path":
c.DatabasePath = val
case "custom_css":
c.CustomCSS = val
case "logfile":
c.Logfile = val
default:
return nil, errors.New("invliad config key " + key)
}
}
return
}
func ParseFile(file string) (c *config, err error) {
f, err := os.Open(file)
if err != nil {
return
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return
}
if info.IsDir() {
return nil, errors.New("invalid config file")
}
return Parse(f)
}