package namecheck import ( "fmt" "sync" ) var ( usernames []string = []string{"foxdeveloper666", "jubobs"} sn []SocialNetwork ) type MyError interface { error Unwrap() error } type ErrUnknownAvailability struct { Username string Cause error } func (e *ErrUnknownAvailability) Unwrap() error { return e.Cause } func (e *ErrUnknownAvailability) Error() string { return fmt.Sprintf("Unknown availability error for %s", e.Username) } type Validator interface { IsValid(username string) bool } type Provider interface { IsAvailable(username string) (bool, error) } type SocialNetwork interface { fmt.Stringer Validator Provider } func AddSn(social SocialNetwork) { sn = append(sn, social) } func SocialNetworks() []SocialNetwork { return sn } func Namecheck(sn SocialNetwork, username string, wg *sync.WaitGroup, ch chan string) { defer wg.Done() if ok := sn.IsValid(username); !ok { ch <- fmt.Sprintf("%s is not valid!", username) } ok, err := sn.IsAvailable(username) if err != nil { err, ok := err.(MyError) if ok { cause := err.Unwrap() ch <- fmt.Sprintf("%v\n", cause) } ch <- fmt.Sprintf("%s\n", err.Error()) } ch <- fmt.Sprintf("On %s \"%v\" is Available : %v\n", sn.String(), username, ok) } func Run(sns []SocialNetwork, username string, ch chan string) { var wg sync.WaitGroup for _, sn := range sns { wg.Add(1) go Namecheck(sn, username, &wg, ch) } wg.Wait() close(ch) }