Current section

Files

Jump to
midas src config config.gleam
Raw

src/config/config.gleam

import gleam/int
import gleam/list
import gleam/map.{Map}
import gleam/result
import midas_utils
type ENV =
Map(String, String)
type Parser(a, b) =
fn(String) -> Result(a, b)
// https://erlang.org/doc/man/os.html#getenv-0
// https://github.com/elixir-lang/elixir/blob/v1.10.3/lib/elixir/lib/system.ex#L438-L444
external fn os_get_env() -> List(String) =
"config_native" "getenv"
pub fn get_env() -> Map(String, String) {
os_get_env()
|> list.fold(
[],
fn(env_var_name_value, done) {
let tuple(
key,
maybe_value,
) = midas_utils.split_on(env_var_name_value, "=")
case maybe_value {
Ok(value) -> [tuple(key, value), ..done]
Error(Nil) -> done
}
},
)
|> map.from_list()
}
fn try_parse(raw, parser) {
case parser(raw) {
Ok(value) -> Ok(value)
Error(_) -> Error(Nil)
}
}
pub fn required(env: ENV, key: String, parser: Parser(a, b)) -> Result(a, Nil) {
map.get(env, key)
|> result.then(try_parse(_, parser))
}
// Unwrap with log warning
pub fn optional(env: ENV, key: String, parser: Parser(a, b), fallback: a) {
map.get(env, key)
|> result.then(try_parse(_, parser))
|> result.unwrap(fallback)
}