If the config on the disk doesn't have all fields, then the missing fields are now populated with their defaults.
272 lines
3.7 KiB
Go
272 lines
3.7 KiB
Go
package value
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// string
|
|
|
|
type String string
|
|
|
|
func NewString(p *string, val string) *String {
|
|
*p = val
|
|
|
|
return (*String)(p)
|
|
}
|
|
|
|
func (s *String) Set(val string) error {
|
|
*s = String(val)
|
|
return nil
|
|
}
|
|
|
|
func (s *String) String() string {
|
|
return string(*s)
|
|
}
|
|
|
|
func (s *String) Validate() error {
|
|
return nil
|
|
}
|
|
|
|
func (s *String) IsEmpty() bool {
|
|
return len(string(*s)) == 0
|
|
}
|
|
|
|
// array of strings
|
|
|
|
type StringList struct {
|
|
p *[]string
|
|
separator string
|
|
}
|
|
|
|
func NewStringList(p *[]string, val []string, separator string) *StringList {
|
|
v := &StringList{
|
|
p: p,
|
|
separator: separator,
|
|
}
|
|
|
|
*p = val
|
|
|
|
return v
|
|
}
|
|
|
|
func (s *StringList) Set(val string) error {
|
|
list := []string{}
|
|
|
|
for _, elm := range strings.Split(val, s.separator) {
|
|
elm = strings.TrimSpace(elm)
|
|
if len(elm) != 0 {
|
|
list = append(list, elm)
|
|
}
|
|
}
|
|
|
|
*s.p = list
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *StringList) String() string {
|
|
if s.IsEmpty() {
|
|
return "(empty)"
|
|
}
|
|
|
|
return strings.Join(*s.p, s.separator)
|
|
}
|
|
|
|
func (s *StringList) Validate() error {
|
|
return nil
|
|
}
|
|
|
|
func (s *StringList) IsEmpty() bool {
|
|
return len(*s.p) == 0
|
|
}
|
|
|
|
// map of strings to strings
|
|
|
|
type StringMapString struct {
|
|
p *map[string]string
|
|
}
|
|
|
|
func NewStringMapString(p *map[string]string, val map[string]string) *StringMapString {
|
|
v := &StringMapString{
|
|
p: p,
|
|
}
|
|
|
|
if *p == nil {
|
|
*p = make(map[string]string)
|
|
}
|
|
|
|
if val != nil {
|
|
*p = val
|
|
}
|
|
|
|
return v
|
|
}
|
|
|
|
func (s *StringMapString) Set(val string) error {
|
|
mappings := make(map[string]string)
|
|
|
|
for _, elm := range strings.Split(val, " ") {
|
|
elm = strings.TrimSpace(elm)
|
|
if len(elm) == 0 {
|
|
continue
|
|
}
|
|
|
|
mapping := strings.SplitN(elm, ":", 2)
|
|
|
|
mappings[mapping[0]] = mapping[1]
|
|
}
|
|
|
|
*s.p = mappings
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *StringMapString) String() string {
|
|
if s.IsEmpty() {
|
|
return "(empty)"
|
|
}
|
|
|
|
mappings := make([]string, len(*s.p))
|
|
|
|
i := 0
|
|
for k, v := range *s.p {
|
|
mappings[i] = k + ":" + v
|
|
i++
|
|
}
|
|
|
|
return strings.Join(mappings, " ")
|
|
}
|
|
|
|
func (s *StringMapString) Validate() error {
|
|
return nil
|
|
}
|
|
|
|
func (s *StringMapString) IsEmpty() bool {
|
|
return len(*s.p) == 0
|
|
}
|
|
|
|
// boolean
|
|
|
|
type Bool bool
|
|
|
|
func NewBool(p *bool, val bool) *Bool {
|
|
*p = val
|
|
|
|
return (*Bool)(p)
|
|
}
|
|
|
|
func (b *Bool) Set(val string) error {
|
|
v, err := strconv.ParseBool(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*b = Bool(v)
|
|
return nil
|
|
}
|
|
|
|
func (b *Bool) String() string {
|
|
return strconv.FormatBool(bool(*b))
|
|
}
|
|
|
|
func (b *Bool) Validate() error {
|
|
return nil
|
|
}
|
|
|
|
func (b *Bool) IsEmpty() bool {
|
|
return !bool(*b)
|
|
}
|
|
|
|
// int
|
|
|
|
type Int int
|
|
|
|
func NewInt(p *int, val int) *Int {
|
|
*p = val
|
|
|
|
return (*Int)(p)
|
|
}
|
|
|
|
func (i *Int) Set(val string) error {
|
|
v, err := strconv.Atoi(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*i = Int(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Int) String() string {
|
|
return strconv.Itoa(int(*i))
|
|
}
|
|
|
|
func (i *Int) Validate() error {
|
|
return nil
|
|
}
|
|
|
|
func (i *Int) IsEmpty() bool {
|
|
return int(*i) == 0
|
|
}
|
|
|
|
// int64
|
|
|
|
type Int64 int64
|
|
|
|
func NewInt64(p *int64, val int64) *Int64 {
|
|
*p = val
|
|
|
|
return (*Int64)(p)
|
|
}
|
|
|
|
func (u *Int64) Set(val string) error {
|
|
v, err := strconv.ParseInt(val, 0, 64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*u = Int64(v)
|
|
return nil
|
|
}
|
|
|
|
func (u *Int64) String() string {
|
|
return strconv.FormatInt(int64(*u), 10)
|
|
}
|
|
|
|
func (u *Int64) Validate() error {
|
|
return nil
|
|
}
|
|
|
|
func (u *Int64) IsEmpty() bool {
|
|
return int64(*u) == 0
|
|
}
|
|
|
|
// uint64
|
|
|
|
type Uint64 uint64
|
|
|
|
func NewUint64(p *uint64, val uint64) *Uint64 {
|
|
*p = val
|
|
|
|
return (*Uint64)(p)
|
|
}
|
|
|
|
func (u *Uint64) Set(val string) error {
|
|
v, err := strconv.ParseUint(val, 0, 64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*u = Uint64(v)
|
|
return nil
|
|
}
|
|
|
|
func (u *Uint64) String() string {
|
|
return strconv.FormatUint(uint64(*u), 10)
|
|
}
|
|
|
|
func (u *Uint64) Validate() error {
|
|
return nil
|
|
}
|
|
|
|
func (u *Uint64) IsEmpty() bool {
|
|
return uint64(*u) == 0
|
|
}
|