service auth, edit and delete now all support --service flag

If a service name is given, this will be used. If not the user is
prompted to select one.
This commit is contained in:
Philipp Wolfer 2023-12-09 22:59:33 +01:00
parent c21715d36b
commit 9449a29fb1
No known key found for this signature in database
GPG key ID: 8FDF744D4919943B
9 changed files with 29 additions and 51 deletions

View file

@ -63,12 +63,8 @@ func (l BackendList) Swap(i, j int) {
type Capability = string
func ResolveBackend[T interface{}](config *config.ServiceConfig) (T, error) {
func ResolveBackend[T interface{}](config config.ServiceConfig) (T, error) {
var result T
if config == nil {
err := fmt.Errorf("config must not be nil")
return result, err
}
backend, err := backendWithConfig(config)
if err != nil {
return result, err
@ -120,12 +116,12 @@ var knownBackends = map[string]func() models.Backend{
"subsonic": func() models.Backend { return &subsonic.SubsonicApiBackend{} },
}
func backendWithConfig(config *config.ServiceConfig) (models.Backend, error) {
func backendWithConfig(config config.ServiceConfig) (models.Backend, error) {
backend, err := BackendByName(config.Backend)
if err != nil {
return nil, err
}
return backend.FromConfig(config), nil
return backend.FromConfig(&config), nil
}
func ImplementsInterface[T interface{}](backend *models.Backend) (bool, string) {

View file

@ -42,7 +42,7 @@ func TestResolveBackend(t *testing.T) {
c := viper.New()
c.Set("backend", "dump")
service := config.NewServiceConfig("test", c)
backend, err := backends.ResolveBackend[models.ListensImport](&service)
backend, err := backends.ResolveBackend[models.ListensImport](service)
assert.NoError(t, err)
assert.IsType(t, &dump.DumpBackend{}, backend)
}
@ -51,7 +51,7 @@ func TestResolveBackendUnknown(t *testing.T) {
c := viper.New()
c.Set("backend", "foo")
service := config.NewServiceConfig("test", c)
_, err := backends.ResolveBackend[models.ListensImport](&service)
_, err := backends.ResolveBackend[models.ListensImport](service)
assert.EqualError(t, err, "unknown backend \"foo\"")
}
@ -59,7 +59,7 @@ func TestResolveBackendInvalidInterface(t *testing.T) {
c := viper.New()
c.Set("backend", "dump")
service := config.NewServiceConfig("test", c)
_, err := backends.ResolveBackend[models.ListensExport](&service)
_, err := backends.ResolveBackend[models.ListensExport](service)
assert.EqualError(t, err, "backend dump does not implement ListensExport")
}

View file

@ -20,11 +20,9 @@ import (
"go.uploadedlobster.com/scotty/internal/config"
)
func GetServiceConfigFromFlag(cmd *cobra.Command, flagName string) *config.ServiceConfig {
func GetServiceConfigFromFlag(cmd *cobra.Command, flagName string) (config.ServiceConfig, error) {
name := cmd.Flag(flagName).Value.String()
config, err := config.GetService(name)
cobra.CheckErr(err)
return config
return config.GetService(name)
}
func getInt64FromFlag(cmd *cobra.Command, flagName string) (result int64) {

View file

@ -21,12 +21,20 @@ import (
"slices"
"github.com/manifoldco/promptui"
"github.com/spf13/cobra"
"go.uploadedlobster.com/scotty/internal/backends"
"go.uploadedlobster.com/scotty/internal/config"
"go.uploadedlobster.com/scotty/internal/i18n"
)
func SelectService() (config.ServiceConfig, error) {
func SelectService(cmd *cobra.Command) (config.ServiceConfig, error) {
// First try to load service from command line flag
service, err := GetServiceConfigFromFlag(cmd, "service")
if err == nil {
return service, nil
}
// Prompt the user to select a service
services := config.AllServicesAsList()
if len(services) == 0 {
err := errors.New(i18n.Tr("no existing service configurations"))

View file

@ -116,13 +116,13 @@ func AllServicesAsList() ServiceList {
return list
}
func GetService(name string) (*ServiceConfig, error) {
func GetService(name string) (ServiceConfig, error) {
key := "service." + name
config := viper.Sub(key)
if config != nil {
service := NewServiceConfig(name, config)
return &service, nil
return service, nil
}
return nil, fmt.Errorf(i18n.Tr("no service configuration \"%v\"", name))
return ServiceConfig{}, fmt.Errorf(i18n.Tr("no service configuration \"%v\"", name))
}