Packages

Type-safe environment variables for Gleam. Zero dependencies.

Current section

Files

Jump to
envie src envie@dotenv.erl
Raw

src/envie@dotenv.erl

-module(envie@dotenv).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/envie/dotenv.gleam").
-export([override/1, optional/1, required/1, parse/1, parse_file/1, load/1, load_schema_from/2, load_schema/2]).
-export_type([dotenv_source/0, load_schema_error/0]).
-type dotenv_source() :: {override, binary()} |
{optional, binary()} |
{required, binary()}.
-type load_schema_error() :: {load_error, envie@error:load_error()} |
{config_error, envie@error:error()}.
-file("src/envie/dotenv.gleam", 18).
-spec override(binary()) -> dotenv_source().
override(Path) ->
{override, Path}.
-file("src/envie/dotenv.gleam", 22).
-spec optional(binary()) -> dotenv_source().
optional(Path) ->
{optional, Path}.
-file("src/envie/dotenv.gleam", 26).
-spec required(binary()) -> dotenv_source().
required(Path) ->
{required, Path}.
-file("src/envie/dotenv.gleam", 30).
-spec parse(binary()) -> {ok, list({binary(), binary()})} |
{error, list(envie@error:parse_error())}.
parse(Content) ->
envie@parse:parse_dotenv(Content).
-file("src/envie/dotenv.gleam", 119).
-spec append_vars(list({binary(), binary()}), list({binary(), binary()})) -> list({binary(),
binary()}).
append_vars(Left, Right) ->
case Left of
[] ->
Right;
[Head | Tail] ->
[Head | append_vars(Tail, Right)]
end.
-file("src/envie/dotenv.gleam", 140).
-spec save_env(list({binary(), binary()})) -> list({binary(),
gleam@option:option(binary())}).
save_env(Vars) ->
_pipe = Vars,
gleam@list:map(
_pipe,
fun(Pair) ->
{Name, _} = Pair,
Original = case envie:get(Name) of
{ok, Value} ->
{some, Value};
{error, _} ->
none
end,
{Name, Original}
end
).
-file("src/envie/dotenv.gleam", 152).
-spec set_env(list({binary(), binary()})) -> nil.
set_env(Vars) ->
gleam@list:each(
Vars,
fun(Pair) ->
{Name, Value} = Pair,
envie:set(Name, Value)
end
).
-file("src/envie/dotenv.gleam", 159).
-spec restore_env(list({binary(), gleam@option:option(binary())})) -> nil.
restore_env(Saved) ->
gleam@list:each(
Saved,
fun(Pair) ->
{Name, Maybe_value} = Pair,
case Maybe_value of
{some, Value} ->
envie:set(Name, Value);
none ->
envie:unset(Name)
end
end
).
-file("src/envie/dotenv.gleam", 129).
-spec with_temp_env(
list({binary(), binary()}),
fun(() -> {ok, ERJ} | {error, load_schema_error()})
) -> {ok, ERJ} | {error, load_schema_error()}.
with_temp_env(A, F) ->
Original = save_env(A),
set_env(A),
Result = F(),
restore_env(Original),
Result.
-file("src/envie/dotenv.gleam", 36).
-spec parse_file(binary()) -> {ok, list({binary(), binary()})} |
{error, envie@error:load_error()}.
parse_file(Path) ->
case envie_ffi:read_file(Path) of
{ok, Content} ->
case envie@parse:parse_dotenv(Content) of
{ok, Vars} ->
{ok, Vars};
{error, Errors} ->
{error, {parse_error, Errors}}
end;
{error, _} ->
{error, {file_not_found, Path}}
end.
-file("src/envie/dotenv.gleam", 84).
-spec vars_from_source(dotenv_source()) -> {ok, list({binary(), binary()})} |
{error, envie@error:load_error()}.
vars_from_source(Source) ->
case Source of
{override, Path} ->
parse_file(Path);
{optional, Path@1} ->
case envie_ffi:read_file(Path@1) of
{ok, Content} ->
case envie@parse:parse_dotenv(Content) of
{ok, Vars} ->
{ok, Vars};
{error, Errors} ->
{error, {parse_error, Errors}}
end;
{error, _} ->
{ok, []}
end;
{required, Path@2} ->
parse_file(Path@2)
end.
-file("src/envie/dotenv.gleam", 102).
-spec vars_from_sources(list(dotenv_source())) -> {ok,
list({binary(), binary()})} |
{error, envie@error:load_error()}.
vars_from_sources(Sources) ->
case Sources of
[] ->
{ok, []};
[Source | Rest] ->
case vars_from_source(Source) of
{ok, Vars} ->
case vars_from_sources(Rest) of
{ok, Next} ->
{ok, append_vars(Vars, Next)};
{error, Err} ->
{error, Err}
end;
{error, Err@1} ->
{error, Err@1}
end
end.
-file("src/envie/dotenv.gleam", 54).
-spec load(list(dotenv_source())) -> {ok, nil} |
{error, envie@error:load_error()}.
load(Sources) ->
case vars_from_sources(Sources) of
{ok, Vars} ->
{ok, set_env(Vars)};
{error, Err} ->
{error, Err}
end.
-file("src/envie/dotenv.gleam", 68).
-spec load_schema_from(list(dotenv_source()), envie@schema:schema(EQU)) -> {ok,
EQU} |
{error, load_schema_error()}.
load_schema_from(Sources, Schema) ->
case vars_from_sources(Sources) of
{ok, Vars} ->
with_temp_env(Vars, fun() -> _pipe = envie@schema:load(Schema),
gleam@result:map_error(
_pipe,
fun(Err) -> {config_error, Err} end
) end);
{error, Err@1} ->
{error, {load_error, Err@1}}
end.
-file("src/envie/dotenv.gleam", 61).
-spec load_schema(dotenv_source(), envie@schema:schema(EQP)) -> {ok, EQP} |
{error, load_schema_error()}.
load_schema(Source, Schema) ->
load_schema_from([Source], Schema).