Dynamic per-backend configuration options

This commit is contained in:
Philipp Wolfer 2023-12-05 23:25:15 +01:00
parent ae5f1c5f26
commit c9fa21be73
No known key found for this signature in database
GPG key ID: 8FDF744D4919943B
14 changed files with 262 additions and 17 deletions

View file

@ -63,7 +63,7 @@ func (l BackendList) Swap(i, j int) {
type Capability = string
func ResolveBackend[T interface{}](config *viper.Viper) (T, error) {
backendName, backend, err := resolveBackend(config)
backendName, backend, err := backendWithConfig(config)
var result T
if err != nil {
return result, err
@ -78,6 +78,14 @@ func ResolveBackend[T interface{}](config *viper.Viper) (T, error) {
return result, err
}
func BackendByName(backendName string) (models.Backend, error) {
backendType := knownBackends[backendName]
if backendType == nil {
return nil, fmt.Errorf("unknown backend %s", backendName)
}
return backendType(), nil
}
func GetBackends() BackendList {
backends := make(BackendList, 0)
for name, backendFunc := range knownBackends {
@ -107,13 +115,13 @@ var knownBackends = map[string]func() models.Backend{
"subsonic": func() models.Backend { return &subsonic.SubsonicApiBackend{} },
}
func resolveBackend(config *viper.Viper) (string, models.Backend, error) {
func backendWithConfig(config *viper.Viper) (string, models.Backend, error) {
backendName := config.GetString("backend")
backendType := knownBackends[backendName]
if backendType == nil {
return backendName, nil, fmt.Errorf("unknown backend %s", backendName)
backend, err := BackendByName(backendName)
if err != nil {
return backendName, nil, err
}
return backendName, backendType().FromConfig(config), nil
return backendName, backend.FromConfig(config), nil
}
func ImplementsInterface[T interface{}](backend *models.Backend) (bool, string) {