You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
synctv/internal/settings/setting.go

130 lines
2.5 KiB
Go

package settings
import (
"fmt"
log "github.com/sirupsen/logrus"
"github.com/synctv-org/synctv/internal/db"
"github.com/synctv-org/synctv/internal/model"
)
var (
Settings map[string]Setting
GroupSettings map[model.SettingGroup][]Setting
)
type Setting interface {
Name() string
Type() model.SettingType
Group() model.SettingGroup
Init(string)
Raw() string
SetRaw(string) error
DefaultRaw() string
DefaultInterface() any
Interface() (any, error)
}
func SetValue(name string, value any) error {
s, ok := Settings[name]
if !ok {
return fmt.Errorf("setting %s not found", name)
}
return SetSettingValue(s, value)
}
func SetSettingValue(s Setting, value any) error {
switch s.Type() {
case model.SettingTypeBool:
i, ok := s.(BoolSetting)
if !ok {
log.Fatalf("setting %s is not bool", s.Name())
}
v, ok := value.(bool)
if !ok {
return fmt.Errorf("setting %s, value %v is not bool", s.Name(), value)
}
i.Set(v)
case model.SettingTypeInt64:
i, ok := s.(Int64Setting)
if !ok {
log.Fatalf("setting %s is not int64", s.Name())
}
v, ok := value.(int64)
if !ok {
return fmt.Errorf("setting %s, value %v is not int64", s.Name(), value)
}
i.Set(v)
case model.SettingTypeFloat64:
i, ok := s.(Float64Setting)
if !ok {
log.Fatalf("setting %s is not float64", s.Name())
}
v, ok := value.(float64)
if !ok {
return fmt.Errorf("setting %s, value %v is not float64", s.Name(), value)
}
i.Set(v)
case model.SettingTypeString:
i, ok := s.(StringSetting)
if !ok {
log.Fatalf("setting %s is not string", s.Name())
}
v, ok := value.(string)
if !ok {
return fmt.Errorf("setting %s, value %v is not string", s.Name(), value)
}
i.Set(v)
default:
log.Fatalf("unknown setting type: %s", s.Type())
}
return nil
}
func ToSettings[s Setting](settings map[string]s) []Setting {
var ss []Setting = make([]Setting, 0, len(settings))
for _, v := range settings {
ss = append(ss, v)
}
return ss
}
type Int64Setting interface {
Set(int64) error
Get() (int64, error)
Raw() string
}
type Float64Setting interface {
Set(float64) error
Get() (float64, error)
Raw() string
}
type StringSetting interface {
Set(string) error
Get() (string, error)
Raw() string
}
func Init() error {
return initSettings(ToSettings(Settings)...)
}
func initSettings(i ...Setting) error {
for _, b := range i {
s := &model.Setting{
Name: b.Name(),
Value: b.Raw(),
Type: b.Type(),
Group: b.Group(),
}
err := db.FirstOrCreateSettingItemValue(s)
if err != nil {
return err
}
b.Init(s.Value)
}
return nil
}