import Configuration import Hummingbird import Logging /// The entry point of the website executable. /// /// Loads the configuration, then either serves the website or — when the `database.migrate` flag is set — runs the registered migrations against the /// configured backend and exits. @main struct App { /// Loads the configuration and runs the mode it selects. /// /// The configuration is read from the providers in precedence order: command-line arguments first, then process environment variables, then a /// `.env` file when one is present, and finally the in-memory defaults (currently just the server name). static func main() async throws { let reader = try await ConfigReader( providers: [ CommandLineArgumentsProvider(), EnvironmentVariablesProvider(), EnvironmentVariablesProvider( environmentFilePath: ".env", allowMissing: true ), InMemoryProvider(values: [ .HTTP.serverName: .HTTP.serverName ]), ] ) // Migrate-and-exit mode runs the registered migrations against the configured backend and returns, // so a shared database is migrated by a single deliberate invocation (`--database-migrate`) rather // than by every booting instance. guard !reader.migrate else { try await migration( reader: reader ) return } let app = await application( reader: reader ) try await app.runService() } }