go__sqs_demo/back/services/services.go

87 lines
2.7 KiB
Go

package services
import (
"flag"
"fmt"
"io"
"log"
"time"
"github.com/fgm/izidic"
)
const (
// Flags
PAddr = "addr"
PPrefix = "prefix"
PProfile = "profile"
PQName = "queue-name"
PRegion = "region"
PCSRFSecret = "csrf-secret"
PStoreSecret = "store-secret"
PTTL = "ttl"
PURL = "url"
PVTO = "vto"
PWait = "wait"
// Non-flags
PArgs = "args"
PHandler = "handler"
PName = "name"
PWriter = "writer"
// Services
SvcClient = "sqs"
SvcConsumer = "consume-message"
SvcFlags = "flags"
SvcHttp = "http"
SvcLister = "lister"
SvcLogger = "logger"
SvcMessageStore = "message-store"
SvcProducer = "producer"
SvcReceiver = "receiver"
SvcRedriver = "redriver"
SvcRenderer = "renderer"
)
func FlagsService(dic *izidic.Container) (any, error) {
fs := flag.NewFlagSet(dic.MustParam(PName).(string), flag.ContinueOnError)
addr := fs.String(PAddr, ":8080", "The IP address on which to listen")
profile := fs.String(PProfile, "test-profile", "The AWS profile")
region := fs.String(PRegion, "eu-west-3", "The AWS region to connect to")
qName := fs.String(PQName, "dummy-queue", "The queue name")
csrfSecret := fs.String(PCSRFSecret, "csrfSecret", "The CSRF secret")
prefix := fs.String(PPrefix, "", "The queue prefix to filter the main list")
storeSecret := fs.String(PStoreSecret, "storeSecret", "The session store secret")
sqsURL := fs.String(PURL, "http://localhost:4566", "The SQS endpoint URL")
ttl := fs.Duration(PTTL, 10*time.Minute, "The message store TTL")
vto := fs.Duration(PVTO, 10*time.Minute, "The redrive visibility timeout")
wait := fs.Int(PWait, 3, "The maximum number of seconds to wait when receiving messages")
if err := fs.Parse(dic.MustParam(PArgs).([]string)); err != nil {
return nil, fmt.Errorf("cannot obtain CLI args")
}
// Durations are signed, and Duration.Round rounds down, but we want positive durations, rounded up.
*vto = (vto.Abs() + 500*time.Millisecond).Round(time.Second)
dic.Store(PAddr, *addr)
dic.Store(PProfile, *profile)
dic.Store(PQName, *qName)
dic.Store(PRegion, *region)
dic.Store(PCSRFSecret, []byte(*csrfSecret))
dic.Store(PPrefix, *prefix)
dic.Store(PStoreSecret, []byte(*storeSecret))
dic.Store(PTTL, *ttl)
dic.Store(PURL, *sqsURL)
dic.Store(PVTO, *vto)
dic.Store(PWait, *wait)
return fs, nil
}
// LoggerService is an izidic.Service also containing a one-time initialization action.
func LoggerService(dic *izidic.Container) (any, error) {
w := dic.MustParam(PWriter).(io.Writer)
log.SetOutput(w) // Support dependency code not taking an injected logger.
logger := log.New(w, "", log.LstdFlags)
return logger, nil
}