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

141 lines
2.4 KiB
Go

package settings
import (
"fmt"
"strconv"
"sync/atomic"
"github.com/synctv-org/synctv/internal/model"
)
type BoolSetting interface {
Setting
Set(bool) error
Get() bool
Default() bool
Parse(string) (bool, error)
Stringify(bool) string
}
var _ BoolSetting = (*Bool)(nil)
type Bool struct {
setting
defaultValue bool
value uint32
2 years ago
beforeSet func(BoolSetting, bool) error
}
2 years ago
type BoolSettingOption func(*Bool)
func WithBeforeSetBool(beforeSet func(BoolSetting, bool) error) BoolSettingOption {
return func(s *Bool) {
s.beforeSet = beforeSet
}
}
func newBool(name string, value bool, group model.SettingGroup, options ...BoolSettingOption) *Bool {
b := &Bool{
setting: setting{
name: name,
group: group,
settingType: model.SettingTypeBool,
},
defaultValue: value,
}
2 years ago
for _, option := range options {
option(b)
}
b.set(value)
return b
}
func (b *Bool) set(value bool) {
if value {
atomic.StoreUint32(&b.value, 1)
} else {
atomic.StoreUint32(&b.value, 0)
}
}
func (b *Bool) Get() bool {
return atomic.LoadUint32(&b.value) == 1
}
func (b *Bool) Init(value string) error {
v, err := b.Parse(value)
if err != nil {
return err
}
b.set(v)
return nil
}
func (b *Bool) Parse(value string) (bool, error) {
return strconv.ParseBool(value)
}
func (b *Bool) Stringify(value bool) string {
return strconv.FormatBool(value)
}
func (b *Bool) Default() bool {
return b.defaultValue
}
2 years ago
func (b *Bool) DefaultString() string {
return b.Stringify(b.defaultValue)
}
2 years ago
func (b *Bool) String() string {
return b.Stringify(b.Get())
}
func (b *Bool) DefaultInterface() any {
return b.Default()
}
2 years ago
func (b *Bool) SetString(value string) error {
v, err := b.Parse(value)
if err != nil {
return err
}
2 years ago
if b.beforeSet != nil {
err = b.beforeSet(b, v)
if err != nil {
return err
}
}
b.set(v)
return nil
}
2 years ago
func (b *Bool) Set(value bool) (err error) {
if b.beforeSet != nil {
err = b.beforeSet(b, value)
if err != nil {
return err
}
}
2 years ago
b.set(value)
2 years ago
return
}
func (b *Bool) Interface() any {
return b.Get()
}
2 years ago
func NewBoolSetting(k string, v bool, g model.SettingGroup, options ...BoolSettingOption) BoolSetting {
_, loaded := Settings[k]
if loaded {
panic(fmt.Sprintf("setting %s already exists", k))
}
2 years ago
b := newBool(k, v, g, options...)
Settings[k] = b
GroupSettings[g] = append(GroupSettings[g], b)
return b
}