import envoy import filepath as path import gleam/erlang/process import gleam/result import pog import server/context.{Context} import server/router import server/seed import server/supervision_tree import wisp pub fn main() -> Nil { wisp.configure_logger() let db_process_name = process.new_name("db_conn") let db = pog.named_connection(db_process_name) let assert Ok(static_directory) = static_directory() let assert Ok(secret_key) = envoy.get("SECRET_KEY") let assert Ok(pog_config) = read_connection_uri(db_process_name) let ctx = Context(db:, static_directory:, secret_key:) let handler = router.handle_request(_, ctx) let assert Ok(_) = supervision_tree.init(pog_config, handler, secret_key) let assert Ok(_) = seed.germinate(ctx) // All done! process.sleep_forever() } /// Reads the postgres connection string from the environment /// /// ## Example /// /// ```sh /// DATABASE_URL="postgresql://user:password@host:port/database" /// ``` pub fn read_connection_uri( name: process.Name(pog.Message), ) -> Result(pog.Config, Nil) { use postgres_uri <- result.try(envoy.get("DATABASE_URL")) pog.url_config(name, postgres_uri) } /// Path to the application priv directory pub fn static_directory() -> Result(String, Nil) { use priv <- result.map(wisp.priv_directory("server")) path.join(priv, "static") }