59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
|
|
"github.com/alecthomas/kong"
|
|
|
|
"code.icb4dc0.de/prskr/pg_v_man/infrastructure/config"
|
|
"code.icb4dc0.de/prskr/pg_v_man/infrastructure/db"
|
|
"code.icb4dc0.de/prskr/pg_v_man/infrastructure/rabbitmq"
|
|
)
|
|
|
|
func RunApp(ctx context.Context) error {
|
|
var app App
|
|
|
|
return kong.Parse(
|
|
&app,
|
|
kong.Name("replication-emitter"),
|
|
kong.BindTo(ctx, (*context.Context)(nil)),
|
|
).Run()
|
|
}
|
|
|
|
type App struct {
|
|
Logging config.Logging `embed:"" prefix:"logging."`
|
|
DB config.DB `embed:"" prefix:"db."`
|
|
RabbitMQ config.RabbitMQ `embed:"" prefix:"rabbitmq."`
|
|
}
|
|
|
|
func (a *App) Run(ctx context.Context) (err error) {
|
|
publisher, err := rabbitmq.NewPublishingEventConsumer(ctx, a.RabbitMQ)
|
|
if err != nil {
|
|
return fmt.Errorf("could not create publishing event consumer: %w", err)
|
|
}
|
|
|
|
replClient, err := db.NewReplicationClient(ctx, a.DB, publisher)
|
|
if err != nil {
|
|
return fmt.Errorf("could not create replication client: %w", err)
|
|
}
|
|
|
|
defer func() {
|
|
err = errors.Join(err, replClient.Close(context.Background()))
|
|
}()
|
|
|
|
return replClient.Receive(ctx)
|
|
}
|
|
|
|
func (a *App) AfterApply(kongCtx *kong.Context) error {
|
|
defaultLogger := slog.New(slog.NewJSONHandler(os.Stderr, a.Logging.Options()))
|
|
|
|
slog.SetDefault(defaultLogger)
|
|
|
|
kongCtx.Bind(defaultLogger)
|
|
|
|
return nil
|
|
}
|