34 lines
947 B
Go
34 lines
947 B
Go
package provider
|
|||
|
|
|
||
|
|
import "sort"
|
||
|
|
|
||
|
|
// registry 保存所有已注册的上游适配器。
|
||
|
|
// 适配器在自己的 init() 里调用 Register;主干只通过 Get/Names 访问。
|
||
|
|
var registry = map[string]Provider{}
|
||
|
|
|
||
|
|
// Register 注册一个上游适配器。通常在适配器包的 init() 里调用。
|
||
|
|
// 重名注册会 panic —— 说明有重名 bug,应立即暴露。
|
||
|
|
func Register(p Provider) {
|
||
|
|
name := p.Name()
|
||
|
|
if _, ok := registry[name]; ok {
|
||
|
|
panic("provider: duplicate registration: " + name)
|
||
|
|
}
|
||
|
|
registry[name] = p
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get 按名字取已注册的上游适配器;不存在返回 false。
|
||
|
|
func Get(name string) (Provider, bool) {
|
||
|
|
p, ok := registry[name]
|
||
|
|
return p, ok
|
||
|
|
}
|
||
|
|
|
||
|
|
// Names 返回所有已注册适配器的名字(排序稳定),供 admin UI 下拉框使用。
|
||
|
|
func Names() []string {
|
||
|
|
names := make([]string, 0, len(registry))
|
||
|
|
for name := range registry {
|
||
|
|
names = append(names, name)
|
||
|
|
}
|
||
|
|
sort.Strings(names)
|
||
|
|
return names
|
||
|
|
}
|