package enum import ( "encoding/json" "fmt" "strings" ) func MarshalEnum[T fmt.Stringer](val T) ([]byte, error) { return json.Marshal(val.String()) } func UnmarshalEnum[T fmt.Stringer](b []byte, enumValues []T) (T, error) { var zero T s := strings.Trim(string(b), `"`) for _, val := range enumValues { if val.String() == s { return val, nil } } return zero, fmt.Errorf("invalid value: %s", s) }