// Copyright © 2023 Roberto Hidalgo // SPDX-License-Identifier: Apache-2.0 package config import ( "encoding/json" "fmt" "io/fs" "os" "os/signal" "syscall" "git.rob.mx/nidito/chinampa/pkg/logger" ) var flog = logger.Sub("event-gateway.config.file") var FS fs.FS type fileSchema map[string]*Listener type File struct { Path string } var _ Loader = &File{} func (l *File) String() string { return fmt.Sprintf("FileLoader at %s", l.Path) } func (l *File) Load() (res []*Listener, err error) { var data []byte if FS != nil { data, err = fs.ReadFile(FS, l.Path) } else { data, err = os.ReadFile(l.Path) } if err != nil { return res, fmt.Errorf("could not read %s: %s", l.Path, err) } config := &fileSchema{} if err := json.Unmarshal(data, &config); err != nil { return res, fmt.Errorf("could not unserialize %s as json: %s", l.Path, err) } for name, listener := range *config { listener.ID = name res = append(res, listener) } return res, nil } func (l *File) Watch(reg chan []*Listener) { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGHUP) go func() { for { <-c flog.Info("SIGHUP detected, reloading file configuration") res, err := l.Load() if err != nil { flog.Errorf("could not reload file configuration: %s", err) } flog.Info("Reloaded file configuration, updating listeners") reg <- res } }() }