package config import ( "errors" "fmt" "strings" ) //go:generate stringer -type Env type Env uint8 const ( Dev Env = iota + 1 Prod Qa Test ) var Envs = [...]Env{ Dev, Prod, Qa, Test, } func (e Env) MarshalText() ([]byte, error) { return []byte(e.String()), nil } var ErrEnvUnmarshal = errors.New("unable to unmarshal value") func (e *Env) UnmarshalText(text []byte) error { if e == nil { return fmt.Errorf("%w: nil pointer", ErrEnvUnmarshal) } val := strings.ToUpper(string(text)) for _, ee := range Envs { if val == strings.ToUpper(ee.String()) { *e = ee return nil } } return fmt.Errorf("%w: invalid value: %s", ErrEnvUnmarshal, text) } func ValidEnvOrDev(e Env) Env { if ValidEnv(e) { return e } return Dev } func ValidEnv(env Env) bool { for _, e := range Envs { if env == e { return true } } return false }