Compare commits
11 Commits
lash/custo
...
implement-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e2d1f65bb3
|
||
|
|
bdde401439
|
||
|
|
a5c1ac2415
|
||
|
|
504e4baf56
|
||
|
|
d8a852575d
|
||
|
|
c8c0daac24 | ||
|
|
1bcffe2d23
|
||
| bf10e5357c | |||
|
|
d91c96f541 | ||
|
|
ec9032a42e | ||
|
|
6619afe62b |
@@ -1,6 +1,7 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.defalsify.org/vise.git/logging"
|
"git.defalsify.org/vise.git/logging"
|
||||||
@@ -23,6 +24,7 @@ var (
|
|||||||
userDbConn string
|
userDbConn string
|
||||||
userDbConnMode storage.DbMode
|
userDbConnMode storage.DbMode
|
||||||
Languages []string
|
Languages []string
|
||||||
|
configManager *Config
|
||||||
)
|
)
|
||||||
|
|
||||||
type Override struct {
|
type Override struct {
|
||||||
@@ -134,6 +136,17 @@ func GetConns() (storage.Conns, error) {
|
|||||||
|
|
||||||
// LoadConfig initializes the configuration values after environment variables are loaded.
|
// LoadConfig initializes the configuration values after environment variables are loaded.
|
||||||
func LoadConfig() error {
|
func LoadConfig() error {
|
||||||
|
configManager = NewConfig(logg)
|
||||||
|
|
||||||
|
// Add configuration keys with validation
|
||||||
|
configManager.AddKey("HOST", "127.0.0.1", false, nil)
|
||||||
|
configManager.AddKey("PORT", "7123", false, func(v string) error {
|
||||||
|
_, err := strconv.Atoi(v)
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
configManager.AddKey("DB_CONN", "", true, nil)
|
||||||
|
// ... add other keys ? or is enough :/ ...
|
||||||
|
|
||||||
err := setConn()
|
err := setConn()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -145,5 +158,7 @@ func LoadConfig() error {
|
|||||||
DefaultLanguage = defaultLanguage
|
DefaultLanguage = defaultLanguage
|
||||||
Languages = languages
|
Languages = languages
|
||||||
|
|
||||||
|
// Report configuration
|
||||||
|
configManager.Report("INFO")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
63
config/config_test.go
Normal file
63
config/config_test.go
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
// +build configreport
|
||||||
|
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.defalsify.org/vise.git/logging"
|
||||||
|
)
|
||||||
|
|
||||||
|
// go test -tags configreport ./config/... ---> run with tag
|
||||||
|
func TestConfig(t *testing.T) {
|
||||||
|
logger := logging.NewVanilla().WithDomain("test")
|
||||||
|
cfg := NewConfig(logger)
|
||||||
|
|
||||||
|
t.Run("Default Values", func(t *testing.T) {
|
||||||
|
cfg.AddKey("TEST_KEY", "default", false, nil)
|
||||||
|
value, err := cfg.GetValue("TEST_KEY")
|
||||||
|
t.Logf("Got value: %q, error: %v", value, err)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
if value != "default" {
|
||||||
|
t.Errorf("expected 'default', got '%s'", value)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Environment Override", func(t *testing.T) {
|
||||||
|
os.Setenv("TEST_ENV_KEY", "override")
|
||||||
|
defer os.Unsetenv("TEST_ENV_KEY")
|
||||||
|
|
||||||
|
cfg.AddKey("TEST_ENV_KEY", "default", false, nil)
|
||||||
|
value, err := cfg.GetValue("TEST_ENV_KEY")
|
||||||
|
t.Logf("Got value: %q, error: %v", value, err)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
if value != "override" {
|
||||||
|
t.Errorf("expected 'override', got '%s'", value)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Validation", func(t *testing.T) {
|
||||||
|
validator := func(v string) error {
|
||||||
|
if v != "valid" {
|
||||||
|
return fmt.Errorf("invalid value")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.AddKey("VALIDATED_KEY", "valid", false, validator)
|
||||||
|
os.Setenv("VALIDATED_KEY", "invalid")
|
||||||
|
defer os.Unsetenv("VALIDATED_KEY")
|
||||||
|
|
||||||
|
value, err := cfg.GetValue("VALIDATED_KEY")
|
||||||
|
t.Logf("Got value: %q, error: %v", value, err)
|
||||||
|
if err == nil {
|
||||||
|
t.Error("expected validation error, got nil")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
95
config/reporter.go
Normal file
95
config/reporter.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
//go:build configreport
|
||||||
|
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.defalsify.org/vise.git/logging"
|
||||||
|
"git.grassecon.net/grassrootseconomics/visedriver/env"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ConfigValue represents a configuration key-value pair
|
||||||
|
type ConfigValue struct {
|
||||||
|
Key string
|
||||||
|
Default string
|
||||||
|
Validator func(string) error
|
||||||
|
Sensitive bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config handles configuration management and reporting
|
||||||
|
type Config struct {
|
||||||
|
values map[string]ConfigValue
|
||||||
|
logger logging.Vanilla
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewConfig(logger logging.Vanilla) *Config {
|
||||||
|
return &Config{
|
||||||
|
values: make(map[string]ConfigValue),
|
||||||
|
logger: logger,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddKey registers a new configuration key with optional validation
|
||||||
|
func (c *Config) AddKey(key string, defaultValue string, sensitive bool, validator func(string) error) {
|
||||||
|
c.values[key] = ConfigValue{
|
||||||
|
Key: key,
|
||||||
|
Default: defaultValue,
|
||||||
|
Validator: validator,
|
||||||
|
Sensitive: sensitive,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValue returns the value for a given key, applying environment override if present
|
||||||
|
func (c *Config) GetValue(key string) (string, error) {
|
||||||
|
// Find config value by key
|
||||||
|
var cv ConfigValue
|
||||||
|
for _, v := range c.values {
|
||||||
|
if v.Key == key {
|
||||||
|
cv = v
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if cv.Key == "" {
|
||||||
|
return "", fmt.Errorf("configuration key not found: %s", key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get value from environment or default
|
||||||
|
value := env.GetEnv(key, cv.Default)
|
||||||
|
|
||||||
|
// Validate if validator exists
|
||||||
|
if cv.Validator != nil && cv.Validator(value) != nil {
|
||||||
|
return "", fmt.Errorf("invalid value for key %s", key)
|
||||||
|
}
|
||||||
|
|
||||||
|
return value, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Report outputs all configuration values at the specified log level
|
||||||
|
func (c *Config) Report(level string) {
|
||||||
|
for _, cv := range c.values {
|
||||||
|
value, err := c.GetValue(cv.Key)
|
||||||
|
if err != nil {
|
||||||
|
c.logger.Errorf("Error getting value for %s: %v", cv.Key, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if cv.Sensitive {
|
||||||
|
value = "****"
|
||||||
|
}
|
||||||
|
|
||||||
|
switch level {
|
||||||
|
case "DEBUG":
|
||||||
|
c.logger.Debugf("config set", cv.Key, value)
|
||||||
|
case "INFO":
|
||||||
|
c.logger.Infof("config set", cv.Key, value)
|
||||||
|
case "WARN":
|
||||||
|
c.logger.Warnf("config set", cv.Key, value)
|
||||||
|
case "ERROR":
|
||||||
|
c.logger.Errorf("config set", cv.Key, value)
|
||||||
|
default:
|
||||||
|
c.logger.Infof("config set", cv.Key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
21
config/reporter_noop.go
Normal file
21
config/reporter_noop.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
//go:build !configreport
|
||||||
|
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.defalsify.org/vise.git/logging"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Config struct{}
|
||||||
|
|
||||||
|
func NewConfig(logger logging.Vanilla) *Config {
|
||||||
|
return &Config{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Config) AddKey(key string, defaultValue string, sensitive bool, validator func(string) error) {}
|
||||||
|
|
||||||
|
func (c *Config) GetValue(key string) (string, error) {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Config) Report(level string) {}
|
||||||
2
go.mod
2
go.mod
@@ -3,7 +3,7 @@ module git.grassecon.net/grassrootseconomics/visedriver
|
|||||||
go 1.23.0
|
go 1.23.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.defalsify.org/vise.git v0.2.3-0.20250204132233-2bffe532f21e
|
git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2
|
||||||
github.com/jackc/pgx/v5 v5.7.1
|
github.com/jackc/pgx/v5 v5.7.1
|
||||||
github.com/joho/godotenv v1.5.1
|
github.com/joho/godotenv v1.5.1
|
||||||
)
|
)
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -1,5 +1,7 @@
|
|||||||
git.defalsify.org/vise.git v0.2.3-0.20250204132233-2bffe532f21e h1:gtB9OdX6x5gQRM3W824dEurXuuf/YPInqgtv2KAp5Zo=
|
git.defalsify.org/vise.git v0.2.3-0.20250204132233-2bffe532f21e h1:gtB9OdX6x5gQRM3W824dEurXuuf/YPInqgtv2KAp5Zo=
|
||||||
git.defalsify.org/vise.git v0.2.3-0.20250204132233-2bffe532f21e/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
git.defalsify.org/vise.git v0.2.3-0.20250204132233-2bffe532f21e/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
||||||
|
git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 h1:kbiDZtvphEKsTAnebrB6QxRbB7zdoTHSmzzumXrJ4hw=
|
||||||
|
git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
||||||
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c h1:H9Nm+I7Cg/YVPpEV1RzU3Wq2pjamPc/UtHDgItcb7lE=
|
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c h1:H9Nm+I7Cg/YVPpEV1RzU3Wq2pjamPc/UtHDgItcb7lE=
|
||||||
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c/go.mod h1:rGod7o6KPeJ+hyBpHfhi4v7blx9sf+QsHsA7KAsdN6U=
|
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c/go.mod h1:rGod7o6KPeJ+hyBpHfhi4v7blx9sf+QsHsA7KAsdN6U=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
|||||||
@@ -90,6 +90,10 @@ func (tdb *ThreadGdbmDb) Prefix() uint8 {
|
|||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tdb *ThreadGdbmDb) Base() *db.DbBase {
|
||||||
|
return tdb.Base()
|
||||||
|
}
|
||||||
|
|
||||||
func (tdb *ThreadGdbmDb) SetLock(typ uint8, locked bool) error {
|
func (tdb *ThreadGdbmDb) SetLock(typ uint8, locked bool) error {
|
||||||
tdb.reserve()
|
tdb.reserve()
|
||||||
err := tdb.db.SetLock(typ, locked)
|
err := tdb.db.SetLock(typ, locked)
|
||||||
|
|||||||
@@ -203,6 +203,20 @@ func (ms *MenuStorageService) GetUserdataDb(ctx context.Context) (db.Db, error)
|
|||||||
return userStore, nil
|
return userStore, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ms *MenuStorageService) GetLogDb(ctx context.Context, mainDb db.Db, connStr string, section string) (db.Db, error) {
|
||||||
|
err := ms.ensureDbDir(connStr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
connStr = path.Join(connStr, section)
|
||||||
|
tgdbm := gdbmstorage.NewThreadGdbmDb()
|
||||||
|
err = tgdbm.Connect(ctx, connStr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return tgdbm, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (ms *MenuStorageService) GetResource(ctx context.Context) (resource.Resource, error) {
|
func (ms *MenuStorageService) GetResource(ctx context.Context) (resource.Resource, error) {
|
||||||
store, err := ms.getOrCreateDb(ctx, "resource.gdbm", STORETYPE_RESOURCE)
|
store, err := ms.getOrCreateDb(ctx, "resource.gdbm", STORETYPE_RESOURCE)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user