MetaTube / provider /factory.go
henry99a's picture
Clean commit for Hugging Face Spaces without binary files
ca7217f
package provider
import (
"fmt"
"sync"
)
type (
MovieFactory = func() MovieProvider
ActorFactory = func() ActorProvider
)
var (
// Factory RW Mutex
factoryMu sync.RWMutex
// Actor/Movie Factories
movieFactories = make(map[string]MovieFactory)
actorFactories = make(map[string]ActorFactory)
)
func Register[T Provider](name string, factory func() T) {
factoryMu.Lock()
defer factoryMu.Unlock()
provider := *new(T)
registered := false
if _, ok := any(provider).(ActorProvider); ok {
actorFactories[name] = func() ActorProvider { return any(factory()).(ActorProvider) }
registered = true
}
if _, ok := any(provider).(MovieProvider); ok {
movieFactories[name] = func() MovieProvider { return any(factory()).(MovieProvider) }
registered = true
}
if !registered {
panic(fmt.Sprintf("invalid provider factory: func() %T", provider))
}
}
func RangeMovieFactory(f func(string, MovieFactory) bool) {
factoryMu.RLock()
for name, factory := range movieFactories {
if !f(name, factory) {
return
}
}
factoryMu.RUnlock()
}
func RangeActorFactory(f func(string, ActorFactory) bool) {
factoryMu.RLock()
for name, factory := range actorFactories {
if !f(name, factory) {
return
}
}
factoryMu.RUnlock()
}