96 lines
1.6 KiB
Go
96 lines
1.6 KiB
Go
package domain
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"fmt"
|
|
)
|
|
|
|
type Load int
|
|
|
|
const (
|
|
LoadUnknown Load = iota
|
|
LoadBodyweight
|
|
LoadExternal
|
|
)
|
|
|
|
var loadNames = [...]string{
|
|
LoadUnknown: "",
|
|
LoadBodyweight: "bodyweight",
|
|
LoadExternal: "external",
|
|
}
|
|
|
|
var loadValues = func() map[string]Load {
|
|
m := make(map[string]Load, len(loadNames))
|
|
for i, name := range loadNames {
|
|
m[name] = Load(i)
|
|
}
|
|
return m
|
|
}()
|
|
|
|
func (l Load) String() string {
|
|
if l < 0 || int(l) > len(loadNames) {
|
|
return ""
|
|
}
|
|
return loadNames[l]
|
|
}
|
|
|
|
func ParseLoad(s string) (Load, error) {
|
|
if l, ok := loadValues[s]; ok {
|
|
return l, nil
|
|
}
|
|
return LoadUnknown, fmt.Errorf("load: unknown value %q", s)
|
|
}
|
|
|
|
//func (l Load) MarshalJSON() ([]byte, error) {
|
|
// s := l.String()
|
|
// if s == "" {
|
|
// return nil, fmt.Errorf("load: cannot marshal value %d", int(l))
|
|
// }
|
|
// return json.Marshal(s)
|
|
//}
|
|
//
|
|
//func (l *Load) UnmarshalJSON(data []byte) error {
|
|
// var s string
|
|
// if err := json.Unmarshal(data, &s); err != nil {
|
|
// return err
|
|
// }
|
|
//
|
|
// v, err := ParseLoad(s)
|
|
// if err != nil {
|
|
// return err
|
|
// }
|
|
//
|
|
// *l = v
|
|
// return nil
|
|
//}
|
|
|
|
func (l *Load) Scan(src any) error {
|
|
var s string
|
|
switch v := src.(type) {
|
|
case nil:
|
|
return fmt.Errorf("load: unexpected NULL")
|
|
case string:
|
|
s = v
|
|
case []byte:
|
|
s = string(v)
|
|
default:
|
|
return fmt.Errorf("load: cannot scan %T", src)
|
|
}
|
|
|
|
parsed, err := ParseLoad(s)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*l = parsed
|
|
return nil
|
|
}
|
|
|
|
func (l Load) Value() (driver.Value, error) {
|
|
s := l.String()
|
|
if s == "" {
|
|
return nil, fmt.Errorf("load: cannot store value %d", int(l))
|
|
}
|
|
return s, nil
|
|
}
|