feat: provider interface + registry — factory pattern for multi-cloud
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
package provider
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Factory func(cfg ProviderConfig) (Provider, error)
|
||||
|
||||
var (
|
||||
registry = map[string]Factory{}
|
||||
registryMu sync.RWMutex
|
||||
)
|
||||
|
||||
func Register(name string, factory Factory) {
|
||||
registryMu.Lock()
|
||||
defer registryMu.Unlock()
|
||||
registry[name] = factory
|
||||
}
|
||||
|
||||
func New(name string, cfg ProviderConfig) (Provider, error) {
|
||||
registryMu.RLock()
|
||||
factory, ok := registry[name]
|
||||
registryMu.RUnlock()
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unknown provider: %s (run 'ry provider add %s' first)", name, name)
|
||||
}
|
||||
return factory(cfg)
|
||||
}
|
||||
|
||||
func List() []string {
|
||||
registryMu.RLock()
|
||||
defer registryMu.RUnlock()
|
||||
names := make([]string, 0, len(registry))
|
||||
for name := range registry {
|
||||
names = append(names, name)
|
||||
}
|
||||
sort.Strings(names)
|
||||
return names
|
||||
}
|
||||
Reference in New Issue
Block a user