package main import ( "context" "flag" "time" "git.mstar.dev/mstar/goutils/other" "github.com/rs/zerolog/log" "github.com/testcontainers/testcontainers-go" postgresContainer "github.com/testcontainers/testcontainers-go/modules/postgres" "github.com/testcontainers/testcontainers-go/wait" "gorm.io/driver/postgres" "gorm.io/gen" "gorm.io/gorm" "git.mstar.dev/mstar/linstrom/shared" "git.mstar.dev/mstar/linstrom/storage-new/models" ) // "git.mstar.dev/mstar/linstrom/config" // "context" // "time" // postgresContainer "github.com/testcontainers/testcontainers-go/modules/postgres" // "github.com/testcontainers/testcontainers-go" // "github.com/testcontainers/testcontainers-go/wait" const ( dbName = "linstrom" dbUser = "linstrom" dbPass = "linstrom" ) func main() { other.SetupFlags() flag.Parse() other.ConfigureLogging(nil) // config.ReadAndWriteToGlobal(*shared.FlagConfigFile) // Set up a temporary postgres container for gorm-gen to do its thing log.Info().Msg("Starting temporary postgres container") pgContainer, err := postgresContainer.Run( context.Background(), "postgres:16.4-alpine", postgresContainer.WithDatabase(dbName), postgresContainer.WithUsername(dbUser), postgresContainer.WithPassword(dbPass), testcontainers.WithWaitStrategyAndDeadline( time.Minute, wait.ForLog("database system is ready to accept connections"). WithOccurrence(2). WithStartupTimeout(time.Second*5), ), ) if err != nil { log.Fatal().Err(err).Msg("Failed to setup temporary postgres container") } log.Info().Msg("Temporary postgres container started") defer func() { if err := testcontainers.TerminateContainer(pgContainer); err != nil { log.Fatal().Err(err).Msg("Failed to terminate temporary postgres container") } log.Info().Msg("Temporary postgres container stopped") }() db, err := gorm.Open( // postgres.Open(config.GlobalConfig.Storage.BuildPostgresDSN()), postgres.Open(pgContainer.MustConnectionString(context.Background())), &gorm.Config{ PrepareStmt: false, Logger: shared.NewGormLogger(log.Logger), }, ) if err != nil { log.Fatal().Err(err).Msg("Failed to open connection to temporary container") } log.Info().Msg("Connected to db") g := gen.NewGenerator(gen.Config{ OutPath: "./dbgen", Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode }) g.UseDB(db) log.Info().Msg("Applying basic operations on all datatypes") g.ApplyBasic(models.AllTypes...) log.Info().Msg("Starting generation") g.Execute() log.Info().Msg("Code generation complete") }