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/int64.go

183 lines
3.2 KiB
Go

package settings
import (
"fmt"
"strconv"
"sync/atomic"
"github.com/synctv-org/synctv/internal/db"
"github.com/synctv-org/synctv/internal/model"
)
type Int64Setting interface {
Setting
Set(int64) error
Get() int64
Default() int64
Parse(string) (int64, error)
Stringify(int64) string
}
var _ Int64Setting = (*Int64)(nil)
type Int64 struct {
setting
defaultValue int64
value int64
validator func(int64) error
beforeInit, beforeSet func(Int64Setting, int64) (int64, error)
}
2 years ago
type Int64SettingOption func(*Int64)
func WithValidatorInt64(validator func(int64) error) Int64SettingOption {
return func(s *Int64) {
s.validator = validator
}
}
func WithBeforeInitInt64(beforeInit func(Int64Setting, int64) (int64, error)) Int64SettingOption {
return func(s *Int64) {
s.beforeInit = beforeInit
}
}
func WithBeforeSetInt64(beforeSet func(Int64Setting, int64) (int64, error)) Int64SettingOption {
2 years ago
return func(s *Int64) {
s.beforeSet = beforeSet
}
}
func newInt64(name string, value int64, group model.SettingGroup, options ...Int64SettingOption) *Int64 {
i := &Int64{
setting: setting{
name: name,
group: group,
settingType: model.SettingTypeInt64,
},
defaultValue: value,
value: value,
}
2 years ago
for _, option := range options {
option(i)
}
return i
}
func (i *Int64) Parse(value string) (int64, error) {
2 years ago
v, err := strconv.ParseInt(value, 10, 64)
if err != nil {
return 0, err
}
if i.validator != nil {
return v, i.validator(v)
}
return v, nil
}
func (i *Int64) Stringify(value int64) string {
return strconv.FormatInt(value, 10)
}
func (i *Int64) Init(value string) error {
v, err := i.Parse(value)
if err != nil {
return err
}
if i.beforeInit != nil {
v, err = i.beforeInit(i, v)
if err != nil {
return err
}
}
i.set(v)
return nil
}
func (i *Int64) Default() int64 {
return i.defaultValue
}
2 years ago
func (i *Int64) DefaultString() string {
return i.Stringify(i.defaultValue)
}
func (i *Int64) DefaultInterface() any {
2 years ago
return i.Default()
}
2 years ago
func (i *Int64) String() string {
return i.Stringify(i.Get())
}
2 years ago
func (i *Int64) SetString(value string) error {
v, err := i.Parse(value)
if err != nil {
return err
}
2 years ago
if i.beforeSet != nil {
v, err = i.beforeSet(i, v)
2 years ago
if err != nil {
return err
}
}
err = db.UpdateSettingItemValue(i.name, i.Stringify(v))
if err != nil {
return err
}
2 years ago
i.set(v)
return nil
}
func (i *Int64) set(value int64) {
atomic.StoreInt64(&i.value, value)
}
func (i *Int64) Set(v int64) (err error) {
2 years ago
if i.validator != nil {
err = i.validator(v)
2 years ago
if err != nil {
return err
}
}
if i.beforeSet != nil {
v, err = i.beforeSet(i, v)
2 years ago
if err != nil {
return err
}
}
2 years ago
err = db.UpdateSettingItemValue(i.name, i.Stringify(v))
if err != nil {
return err
}
i.set(v)
2 years ago
return
}
func (i *Int64) Get() int64 {
return atomic.LoadInt64(&i.value)
}
func (i *Int64) Interface() any {
return i.Get()
}
2 years ago
func NewInt64Setting(k string, v int64, g model.SettingGroup, options ...Int64SettingOption) *Int64 {
_, loaded := Settings[k]
if loaded {
panic(fmt.Sprintf("setting %s already exists", k))
}
2 years ago
i := newInt64(k, v, g, options...)
Settings[k] = i
GroupSettings[g] = append(GroupSettings[g], i)
return i
}