๐ฉโ๐ Firefighters API written in Gleam!
lustre
gleam
1import envoy
2import filepath as path
3import gleam/erlang/process
4import gleam/result
5import pog
6import server/context.{Context}
7import server/router
8import server/seed
9import server/supervision_tree
10import wisp
11
12pub fn main() -> Nil {
13 wisp.configure_logger()
14
15 let db_process_name = process.new_name("db_conn")
16 let db = pog.named_connection(db_process_name)
17
18 let assert Ok(static_directory) = static_directory()
19 let assert Ok(secret_key) = envoy.get("SECRET_KEY")
20 let assert Ok(pog_config) = read_connection_uri(db_process_name)
21
22 let ctx = Context(db:, static_directory:, secret_key:)
23 let handler = router.handle_request(_, ctx)
24
25 let assert Ok(_) = supervision_tree.init(pog_config, handler, secret_key)
26 let assert Ok(_) = seed.germinate(ctx)
27
28 // All done!
29 process.sleep_forever()
30}
31
32/// Reads the postgres connection string from the environment
33///
34/// ## Example
35///
36/// ```sh
37/// DATABASE_URL="postgresql://user:password@host:port/database"
38/// ```
39pub fn read_connection_uri(
40 name: process.Name(pog.Message),
41) -> Result(pog.Config, Nil) {
42 use postgres_uri <- result.try(envoy.get("DATABASE_URL"))
43 pog.url_config(name, postgres_uri)
44}
45
46/// Path to the application priv directory
47pub fn static_directory() -> Result(String, Nil) {
48 use priv <- result.map(wisp.priv_directory("server"))
49 path.join(priv, "static")
50}