namecheck/namecheck.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)
}