package main import ( "errors" "strings" ) // StringService provides operations on strings. type StringService interface { Uppercase(string) (string, error) Count(string) int } type stringService struct{} func (stringService) Uppercase(s string) (string, error) { if s == "" { return "", ErrEmpty } return strings.ToUpper(s), nil } func (stringService) Count(s string) int { return len(s) } // ErrEmpty is returned when an input string is empty. var ErrEmpty = errors.New("empty string") // ServiceMiddleware is a chainable behavior modifier for StringService. type ServiceMiddleware func(StringService) StringService