package main import ( "context" "errors" "flag" "fmt" "io" "log" "os" "cmbuyer/admin/internal/migrations" "cmbuyer/admin/internal/storage/sqlite" ) func main() { if err := run(context.Background(), os.Args[1:], os.Stderr); err != nil { log.Print(err) os.Exit(1) } } func run(ctx context.Context, args []string, stderr io.Writer) error { flags := flag.NewFlagSet("migrate", flag.ContinueOnError) flags.SetOutput(stderr) databaseSource := flags.String("database", "", "SQLite data source") migrationDirectory := flags.String("dir", "migrations", "migration directory") if err := flags.Parse(args); err != nil { return err } if *databaseSource == "" { return errors.New("-database is required") } if flags.NArg() != 1 { return fmt.Errorf("usage: migrate -database [-dir ] ") } command := flags.Arg(0) if command != "up" && command != "down" && command != "status" { return fmt.Errorf("unsupported migration command %q", command) } database, err := sqlite.Open(*databaseSource) if err != nil { return fmt.Errorf("open SQLite database: %w", err) } defer func() { if err := database.Close(); err != nil { log.Printf("close SQLite database: %v", err) } }() if err := migrations.Run(ctx, database, *migrationDirectory, command); err != nil { return fmt.Errorf("run migrations: %w", err) } return nil }