tstor/config/handler.go
2021-11-21 18:31:47 +01:00

70 lines
1.4 KiB
Go

package config
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"github.com/distribyted/distribyted"
"gopkg.in/yaml.v3"
)
type EventFunc func(event string)
type ReloadFunc func(*Root, EventFunc) error
type Handler struct {
p string
}
func NewHandler(path string) *Handler {
return &Handler{p: path}
}
func (c *Handler) createFromTemplateFile() ([]byte, error) {
t, err := distribyted.Templates.Open("templates/config_template.yaml")
if err != nil {
return nil, err
}
defer t.Close()
tb, err := ioutil.ReadAll(t)
if err != nil {
return nil, err
}
if err := os.MkdirAll(filepath.Dir(c.p), 0744); err != nil {
return nil, fmt.Errorf("error creating path for configuration file: %s, %w", c.p, err)
}
return tb, ioutil.WriteFile(c.p, tb, 0644)
}
func (c *Handler) GetRaw() ([]byte, error) {
f, err := ioutil.ReadFile(c.p)
if os.IsNotExist(err) {
fmt.Println("configuration file does not exist, creating from template file:", c.p)
return c.createFromTemplateFile()
}
if err != nil {
return nil, fmt.Errorf("error reading configuration file: %w", err)
}
return f, nil
}
func (c *Handler) Get() (*Root, error) {
b, err := c.GetRaw()
if err != nil {
return nil, err
}
conf := &Root{}
if err := yaml.Unmarshal(b, conf); err != nil {
return nil, fmt.Errorf("error parsing configuration file: %w", err)
}
conf = AddDefaults(conf)
return conf, nil
}