Basic TUI to add new service configuration

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

View file

@ -19,6 +19,7 @@ package backends
import (
"fmt"
"reflect"
"sort"
"strings"
"github.com/spf13/viper"
@ -41,6 +42,24 @@ type BackendInfo struct {
ImportCapabilities []Capability
}
func (b BackendInfo) String() string {
return b.Name
}
type BackendList []BackendInfo
func (l BackendList) Len() int {
return len(l)
}
func (l BackendList) Less(i, j int) bool {
return l[i].Name < l[j].Name
}
func (l BackendList) Swap(i, j int) {
l[i], l[j] = l[j], l[i]
}
type Capability = string
func ResolveBackend[T interface{}](config *viper.Viper) (T, error) {
@ -59,8 +78,8 @@ func ResolveBackend[T interface{}](config *viper.Viper) (T, error) {
return result, err
}
func GetBackends() []BackendInfo {
backends := make([]BackendInfo, 0)
func GetBackends() BackendList {
backends := make(BackendList, 0)
for name, backendFunc := range knownBackends {
backend := backendFunc()
info := BackendInfo{
@ -71,6 +90,7 @@ func GetBackends() []BackendInfo {
backends = append(backends, info)
}
sort.Sort(backends)
return backends
}

View file

@ -16,9 +16,11 @@ Scotty. If not, see <https://www.gnu.org/licenses/>.
package config
import (
"fmt"
"os"
"path"
"path/filepath"
"regexp"
"github.com/spf13/cobra"
"github.com/spf13/viper"
@ -74,6 +76,17 @@ func DatabasePath() string {
return filepath.Join(getConfigDir(), path)
}
func ValidateKey(key string) error {
found, err := regexp.MatchString("^[A-Za-z0-9_-]+$", key)
if err != nil {
return err
} else if found {
return nil
} else {
return fmt.Errorf("key must only consist of A-Za-z0-9_-")
}
}
func setDefaults() {
viper.SetDefault("database", defaultDatabase)
viper.SetDefault("oauth-host", defaultOAuthHost)

View file

@ -0,0 +1,32 @@
/*
Copyright © 2023 Philipp Wolfer <phw@uploadedlobster.com>
Scotty is free software: you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later version.
Scotty is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
Scotty. If not, see <https://www.gnu.org/licenses/>.
*/
package config_test
import (
"testing"
"github.com/stretchr/testify/assert"
"go.uploadedlobster.com/scotty/internal/config"
)
func TestTimestampUpdate(t *testing.T) {
assert := assert.New(t)
assert.Nil(config.ValidateKey("foo"))
assert.Nil(config.ValidateKey("foo123"))
assert.Nil(config.ValidateKey("foo_bar-123"))
assert.NotNil(config.ValidateKey("foo/bar"))
assert.NotNil(config.ValidateKey("bär"))
}

View file

@ -0,0 +1,33 @@
/*
Copyright © 2023 Philipp Wolfer <phw@uploadedlobster.com>
Scotty is free software: you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later version.
Scotty is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
Scotty. If not, see <https://www.gnu.org/licenses/>.
*/
package config
import "github.com/spf13/viper"
type ServiceConfig struct {
Name string
Backend string
ConfigValues map[string]any
}
func (c *ServiceConfig) Save() error {
key := "service." + c.Name
viper.Set(key+".backend", c.Backend)
for k, v := range c.ConfigValues {
viper.Set(key+"."+k, v)
}
return viper.WriteConfig()
}