72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
package grouper
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/tedsuo/ifrit"
|
|
)
|
|
|
|
/*
|
|
A Member associates a unique name with a Runner.
|
|
*/
|
|
type Member struct {
|
|
Name string
|
|
ifrit.Runner
|
|
}
|
|
|
|
/*
|
|
Members are treated as an ordered list. Member names must be unique.
|
|
*/
|
|
type Members []Member
|
|
|
|
/*
|
|
Validate checks that all member names in the list are unique. It returns an
|
|
error of type ErrDuplicateNames if duplicates are detected.
|
|
*/
|
|
func (m Members) Validate() error {
|
|
foundNames := map[string]struct{}{}
|
|
foundToken := struct{}{}
|
|
duplicateNames := []string{}
|
|
|
|
for _, member := range m {
|
|
_, present := foundNames[member.Name]
|
|
if present {
|
|
duplicateNames = append(duplicateNames, member.Name)
|
|
continue
|
|
}
|
|
foundNames[member.Name] = foundToken
|
|
}
|
|
|
|
if len(duplicateNames) > 0 {
|
|
return ErrDuplicateNames{duplicateNames}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
/*
|
|
ErrDuplicateNames is returned to indicate two or more members with the same name
|
|
were detected. Because more than one duplicate name may be detected in a single
|
|
pass, ErrDuplicateNames contains a list of all duplicate names found.
|
|
*/
|
|
type ErrDuplicateNames struct {
|
|
DuplicateNames []string
|
|
}
|
|
|
|
func (e ErrDuplicateNames) Error() string {
|
|
var msg string
|
|
|
|
switch len(e.DuplicateNames) {
|
|
case 0:
|
|
msg = fmt.Sprintln("ErrDuplicateNames initialized without any duplicate names.")
|
|
case 1:
|
|
msg = fmt.Sprintln("Duplicate member name:", e.DuplicateNames[0])
|
|
default:
|
|
msg = fmt.Sprintln("Duplicate member names:")
|
|
for _, name := range e.DuplicateNames {
|
|
msg = fmt.Sprintln(name)
|
|
}
|
|
}
|
|
|
|
return msg
|
|
}
|