package sms import ( "errors" ) var ( ErrSmsNoMoney = errors.New("sms no money") ErrSmsProviderReturnBadValue = errors.New("sms provider return bad value") ErrSmsProviderNotFound = errors.New("sms provider not found") providers map[string]ISms = make(map[string]ISms) ) type ISms interface { Send(phone, msg string) error SendTpl(phone, tpl string, params []byte) error // BatchSendTpl( phones []string, tpl, params []string) error GetBalance() (float64, error) // balance available GetAvailable() (int64, error) // how many sms times remain we can send Name() string // provider name } func Use(sms ...ISms) { for _, p := range sms { providers[p.Name()] = p } } func All() map[string]ISms { return providers } func Get(name string) (ISms, error) { sms, ok := providers[name] if ok { return sms, nil } return nil, ErrSmsProviderNotFound } func Clear() { providers = map[string]ISms{} }