From 173152054121a5575a4a41a22d61b1a92bff30db Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Mon, 16 Dec 2024 14:35:38 +0100 Subject: [PATCH] config: factorize integer parsing Add a new GetInt() function to parse an integer value from a parsed ini.File. Use that function instead of duplicated code. Signed-off-by: Robin Jarry --- config/config.go | 18 ++++++++++++++++++ email/worker.go | 10 ++-------- server/server.go | 8 +------- webhooks/legacy.go | 10 ++-------- webhooks/queue.go | 10 ++-------- 5 files changed, 25 insertions(+), 31 deletions(-) diff --git a/config/config.go b/config/config.go index f69bca5413b01b4a45a1bdd74e30fbb43054d1db..ed07086da389b3b323f3723101bfaa8460e010f0 100644 --- a/config/config.go +++ b/config/config.go @@ -1,9 +1,11 @@ package config import ( + "fmt" "log" "os" "path/filepath" + "strconv" "git.sr.ht/~sircmpwn/getopt" "github.com/vaughan0/go-ini" @@ -92,3 +94,19 @@ func GetOrigin(conf ini.File, svc string, external bool) string { origin, _ = conf.Get(svc, "origin") return origin } + +const DefaultQueueSize = 512 + +// Returns the configured integer value for the given section and variable name. +// If nothing is configured, the default value will be returned. +// If an invalid integer is configured, this function will panic. +func GetInt(conf ini.File, section, name string, defValue int) int { + value := defValue + if s, ok := conf.Get(section, name); ok { + var err error + if value, err = strconv.Atoi(s); err != nil { + panic(fmt.Errorf("[%s]%s: %w", section, name, err)) + } + } + return value +} diff --git a/email/worker.go b/email/worker.go index 3d918721549512592c37f14c68e5a476cccfe0d2..a35f17216d054528b32ba867762b8804d9b21d90 100644 --- a/email/worker.go +++ b/email/worker.go @@ -9,10 +9,10 @@ import ( "log" "net/http" "os" - "strconv" "strings" "time" + "git.sr.ht/~sircmpwn/core-go/config" work "git.sr.ht/~sircmpwn/dowork" "github.com/ProtonMail/go-crypto/openpgp" "github.com/emersion/go-message" @@ -257,13 +257,7 @@ func NewQueue(conf ini.File) *Queue { } } - queueSize := 512 - if s, ok := conf.Get("mail", "egress-queue-size"); ok { - var err error - if queueSize, err = strconv.Atoi(s); err != nil { - panic(fmt.Errorf("[mail]egress-queue-size: %w", err)) - } - } + queueSize := config.GetInt(conf, "mail", "egress-queue-size", config.DefaultQueueSize) return &Queue{ Queue: work.NewQueue("email", queueSize), diff --git a/server/server.go b/server/server.go index 62e35a38181e1d5a8c055c661b8496ca0bc81ce5..252aad4498388c54cdddddbe2883a473816917ba 100644 --- a/server/server.go +++ b/server/server.go @@ -260,13 +260,7 @@ func (server *Server) WithMiddleware( // Add dowork task queues for this server to manage func (server *Server) WithQueues(queues ...*work.Queue) *Server { - queueWorkers := 1 - if n, ok := server.conf.Get(server.service, "queue-workers"); ok { - var err error - if queueWorkers, err = strconv.Atoi(n); err != nil { - panic(fmt.Errorf("[%s]queue-workers: %w", server.service, err)) - } - } + queueWorkers := config.GetInt(server.conf, server.service, "queue-workers", 1) server.queues = append(server.queues, queues...) for _, queue := range queues { // Use a different context per worker to allow "goroutine-local" diff --git a/webhooks/legacy.go b/webhooks/legacy.go index d3838d64d9673fe7be5e39095e136b1e9c729fb6..7a92006bb0b25aae8397283df79edd3ccd8f20a6 100644 --- a/webhooks/legacy.go +++ b/webhooks/legacy.go @@ -9,7 +9,6 @@ import ( "io/ioutil" "log" "net/http" - "strconv" "strings" "time" @@ -18,6 +17,7 @@ import ( "github.com/google/uuid" "github.com/vaughan0/go-ini" + "git.sr.ht/~sircmpwn/core-go/config" "git.sr.ht/~sircmpwn/core-go/crypto" "git.sr.ht/~sircmpwn/core-go/database" ) @@ -36,13 +36,7 @@ type LegacySubscription struct { // Creates a new worker for delivering legacy webhooks. The caller must start // the worker themselves. func NewLegacyQueue(conf ini.File) *LegacyQueue { - queueSize := 512 - if s, ok := conf.Get("webhooks", "queue-size"); ok { - var err error - if queueSize, err = strconv.Atoi(s); err != nil { - panic(fmt.Errorf("[webhooks]queue-size: %w", err)) - } - } + queueSize := config.GetInt(conf, "webhooks", "queue-size", config.DefaultQueueSize) return &LegacyQueue{ work.NewQueue("webhooks_legacy", queueSize), } diff --git a/webhooks/queue.go b/webhooks/queue.go index 172043fb23f152da3c1b4914deb1be1cb155e526..2081043031ed2b469ec07ea1e5e4530b1c009792 100644 --- a/webhooks/queue.go +++ b/webhooks/queue.go @@ -9,7 +9,6 @@ import ( "io/ioutil" "log" "net/http" - "strconv" "strings" "time" @@ -20,6 +19,7 @@ import ( "github.com/vaughan0/go-ini" "git.sr.ht/~sircmpwn/core-go/auth" + "git.sr.ht/~sircmpwn/core-go/config" "git.sr.ht/~sircmpwn/core-go/crypto" "git.sr.ht/~sircmpwn/core-go/database" ) @@ -45,13 +45,7 @@ type WebhookSubscription struct { // Creates a new worker for delivering webhooks. The caller must start the // worker themselves. func NewQueue(schema graphql.ExecutableSchema, conf ini.File) *WebhookQueue { - queueSize := 512 - if s, ok := conf.Get("webhooks", "queue-size"); ok { - var err error - if queueSize, err = strconv.Atoi(s); err != nil { - panic(fmt.Errorf("[webhooks]queue-size: %w", err)) - } - } + queueSize := config.GetInt(conf, "webhooks", "queue-size", config.DefaultQueueSize) return &WebhookQueue{work.NewQueue("webhooks", queueSize), schema} }