Current section
Files
Jump to
Current section
Files
src/glenv.erl
-module(glenv).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([parse/1, load/2]).
-export_type([type/0]).
-type type() :: bool | float | int | string.
-spec parse_bool({binary(), type()}, binary()) -> {ok,
{binary(), gleam@dynamic:dynamic_()}} |
{error, nil}.
parse_bool(Definition, Value) ->
Resolution = begin
_pipe = [<<"true"/utf8>>, <<"yes"/utf8>>, <<"1"/utf8>>],
gleam@list:contains(_pipe, gleam@string:lowercase(Value))
end,
{ok, {erlang:element(1, Definition), gleam@dynamic:from(Resolution)}}.
-spec parse_float({binary(), type()}, binary()) -> {ok,
{binary(), gleam@dynamic:dynamic_()}} |
{error, nil}.
parse_float(Definition, Value) ->
case gleam@float:parse(Value) of
{ok, Resolution} ->
{ok,
{erlang:element(1, Definition), gleam@dynamic:from(Resolution)}};
{error, _} ->
{error, nil}
end.
-spec parse_int({binary(), type()}, binary()) -> {ok,
{binary(), gleam@dynamic:dynamic_()}} |
{error, nil}.
parse_int(Definition, Value) ->
case gleam@int:parse(Value) of
{ok, Resolution} ->
{ok,
{erlang:element(1, Definition), gleam@dynamic:from(Resolution)}};
{error, _} ->
{error, nil}
end.
-spec parse_string({binary(), type()}, binary()) -> {ok,
{binary(), gleam@dynamic:dynamic_()}} |
{error, nil}.
parse_string(Definition, Value) ->
{ok, {erlang:element(1, Definition), gleam@dynamic:from(Value)}}.
-spec do_parse({binary(), type()}, binary()) -> {ok,
{binary(), gleam@dynamic:dynamic_()}} |
{error, nil}.
do_parse(Definition, Value) ->
case Definition of
{_, bool} ->
parse_bool(Definition, Value);
{_, float} ->
parse_float(Definition, Value);
{_, int} ->
parse_int(Definition, Value);
{_, string} ->
parse_string(Definition, Value)
end.
-spec parse(list({binary(), type()})) -> {ok,
list({binary(), gleam@dynamic:dynamic_()})} |
{error, nil}.
parse(Definitions) ->
Env = envoy_ffi:all(),
gleam@list:try_map(
Definitions,
fun(Definition) ->
Normalized_definition = {gleam@string:uppercase(
erlang:element(1, Definition)
),
erlang:element(2, Definition)},
case gleam@dict:get(Env, erlang:element(1, Normalized_definition)) of
{ok, Value} ->
do_parse(Normalized_definition, Value);
{error, _} ->
{error, nil}
end
end
).
-spec load(decode:decoder(GBY), list({binary(), type()})) -> {ok, GBY} |
{error, nil}.
load(Decoder, Definitions) ->
_assert_subject = parse(Definitions),
{ok, Parsed_env} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"glenv"/utf8>>,
function => <<"load"/utf8>>,
line => 74})
end,
case begin
_pipe = Parsed_env,
_pipe@1 = maps:from_list(_pipe),
_pipe@2 = gleam@dynamic:from(_pipe@1),
decode:from(Decoder, _pipe@2)
end of
{ok, Env} ->
{ok, Env};
{error, Err} ->
gleam@io:debug(Err),
{error, nil}
end.