82 lines
1.4 KiB
Go
82 lines
1.4 KiB
Go
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)
|
|
}
|