goshort/cmd/shared/shared.go
2023-08-17 14:14:59 -03:00

50 lines
1.5 KiB
Go

package shared
import (
"context"
"flag"
"fmt"
"strings"
"git.maronato.dev/maronato/goshort/internal/config"
"github.com/peterbourgon/ff/v3"
)
type Command struct {
// cfg is the command config populated by Parse.
cfg *config.Config
// exec is the command execution function.
exec func(context.Context, *config.Config) error
}
func NewCommand(cfg *config.Config, exec func(context.Context, *config.Config) error) *Command {
return &Command{
cfg: cfg,
exec: exec,
}
}
func (c *Command) Exec(ctx context.Context, _ []string) error {
return c.exec(ctx, c.cfg)
}
func NewSharedCmdOptions() []ff.Option {
return []ff.Option{
ff.WithEnvVarPrefix("GOSHORT"),
}
}
func RegisterBaseFlags(fs *flag.FlagSet, cfg *config.Config) {
fs.BoolVar(&cfg.Debug, "debug", config.DefaultDebug, "enable debug mode")
fs.StringVar(&cfg.Host, "host", config.DefaultHost, "host to listen on")
fs.StringVar(&cfg.Port, "port", config.DefaultPort, "port to listen on")
}
func RegisterServerFlags(fs *flag.FlagSet, cfg *config.Config) {
fs.StringVar(&cfg.RedisURL, "redis-url", config.DefaultRedisURL, "connection string for redis")
dbTypeString := fmt.Sprintf("type of database to use [%s]", strings.Join(config.DBTypes[:], ", "))
fs.StringVar(&cfg.DBType, "db-type", config.DefaultDBType, dbTypeString)
fs.StringVar(&cfg.DBURL, "db", config.DefaultDBURL, "database connection string or sqlite db path")
fs.DurationVar(&cfg.SessionDuration, "session-duration", config.DefaultSessionDuration, "session duration")
}