package stringsx import ( "fmt" "strings" ) type ( RegisteredCases []string errUnknownCase struct { cases RegisteredCases actual string } ) var ErrUnknownCase = errUnknownCase{} func (r *RegisteredCases) AddCase(c string) string { *r = append(*r, c) return c } func (r *RegisteredCases) String() string { s := make([]string, len(*r)) for i, c := range *r { s[i] = fmt.Sprintf("%#v", c) } return "[" + strings.Join(s, ", ") + "]" } func (r *RegisteredCases) ToUnknownCaseErr(actual string) error { return errUnknownCase{cases: *r, actual: actual} } func (e errUnknownCase) Error() string { return fmt.Sprintf("expected one of %s but got %s", e.cases.String(), e.actual) } func (e errUnknownCase) Is(err error) bool { _, ok := err.(errUnknownCase) return ok }