Current section
Files
Jump to
Current section
Files
src/envie.erl
-module(envie).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/envie.gleam").
-export([get/1, set/2, unset/1, all/0, get_string/2, get_int/2, get_float/2, get_bool/2, get_string_list/3, require/2, require_string/1, require_int/1, require_int_range/3, require_url/1, require_url_with_scheme/2, require_web_url/1, require_non_empty_string/1, require_string_prefix/2, require_string_list/2, require_int_list/2, require_float/1, require_float_range/3, require_bool/1, require_port/1, require_one_of/2, optional/2, load_from_string/1, load_from_string_override/1, load_from/1, load/0, load_override_from/1, load_override/0, parse_dotenv/1, format_error/1, format_errors/1, format_load_error/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-file("src/envie.gleam", 47).
?DOC(" Return the variable's value as `Ok(value)`, or `Error(Nil)` if missing.\n").
-spec get(binary()) -> {ok, binary()} | {error, nil}.
get(Name) ->
envie_ffi:get_env(Name).
-file("src/envie.gleam", 52).
?DOC(" Set an environment variable.\n").
-spec set(binary(), binary()) -> nil.
set(Name, Value) ->
envie_ffi:set_env(Name, Value).
-file("src/envie.gleam", 57).
?DOC(" Remove an environment variable, if present.\n").
-spec unset(binary()) -> nil.
unset(Name) ->
envie_ffi:unset_env(Name).
-file("src/envie.gleam", 62).
?DOC(" Return all environment variables as a `Dict(String, String)`.\n").
-spec all() -> gleam@dict:dict(binary(), binary()).
all() ->
envie_ffi:all_env().
-file("src/envie.gleam", 69).
?DOC(" Get a string variable, fall back to `default` when missing.\n").
-spec get_string(binary(), binary()) -> binary().
get_string(Name, Default) ->
_pipe = get(Name),
gleam@result:unwrap(_pipe, Default).
-file("src/envie.gleam", 74).
?DOC(" Get an integer variable; return `default` if missing or invalid.\n").
-spec get_int(binary(), integer()) -> integer().
get_int(Name, Default) ->
case get(Name) of
{ok, Value} ->
_pipe = gleam_stdlib:parse_int(Value),
gleam@result:unwrap(_pipe, Default);
{error, _} ->
Default
end.
-file("src/envie.gleam", 82).
?DOC(" Get a float variable; return `default` if missing or invalid.\n").
-spec get_float(binary(), float()) -> float().
get_float(Name, Default) ->
case get(Name) of
{ok, Value} ->
_pipe = gleam_stdlib:parse_float(Value),
gleam@result:unwrap(_pipe, Default);
{error, _} ->
Default
end.
-file("src/envie.gleam", 91).
?DOC(
" Get a boolean variable; returns `default` if missing or unrecognised.\n"
" Accepted truthy: `true`, `yes`, `1`, `on`. Falsy: `false`, `no`, `0`, `off`.\n"
).
-spec get_bool(binary(), boolean()) -> boolean().
get_bool(Name, Default) ->
case get(Name) of
{ok, Value} ->
{decoder, Run} = envie@decode:bool(),
_pipe = Run(Value),
gleam@result:unwrap(_pipe, Default);
{error, _} ->
Default
end.
-file("src/envie.gleam", 102).
?DOC(" Split a variable by `separator` into trimmed, non-empty strings.\n").
-spec get_string_list(binary(), binary(), list(binary())) -> list(binary()).
get_string_list(Name, Separator, Default) ->
case get(Name) of
{ok, Value} ->
_pipe = Value,
_pipe@1 = gleam@string:split(_pipe, Separator),
_pipe@2 = gleam@list:map(_pipe@1, fun gleam@string:trim/1),
gleam@list:filter(_pipe@2, fun(S) -> S /= <<""/utf8>> end);
{error, _} ->
Default
end.
-file("src/envie.gleam", 122).
?DOC(
" Require a variable and decode it with `decoder`.\n"
" Returns `Ok(value)` or an `Error` describing missing/invalid input.\n"
).
-spec require(binary(), envie@decode:decoder(EAP)) -> {ok, EAP} |
{error, envie@error:error()}.
require(Name, Decoder) ->
gleam@result:'try'(
begin
_pipe = get(Name),
gleam@result:replace_error(_pipe, {missing, Name})
end,
fun(Value) ->
{decoder, Run} = Decoder,
_pipe@1 = Run(Value),
gleam@result:map_error(
_pipe@1,
fun(Reason) -> {invalid_value, Name, Value, Reason} end
)
end
).
-file("src/envie.gleam", 136).
?DOC(" Require a string variable.\n").
-spec require_string(binary()) -> {ok, binary()} | {error, envie@error:error()}.
require_string(Name) ->
require(Name, envie@decode:string()).
-file("src/envie.gleam", 141).
?DOC(" Require an integer variable.\n").
-spec require_int(binary()) -> {ok, integer()} | {error, envie@error:error()}.
require_int(Name) ->
require(Name, envie@decode:int()).
-file("src/envie.gleam", 146).
?DOC(" Require an integer within `[min, max]`.\n").
-spec require_int_range(binary(), integer(), integer()) -> {ok, integer()} |
{error, envie@error:error()}.
require_int_range(Name, Min, Max) ->
require(Name, envie@decode:int_range(Min, Max)).
-file("src/envie.gleam", 155).
?DOC(" Require a valid URL (permissive).\n").
-spec require_url(binary()) -> {ok, gleam@uri:uri()} |
{error, envie@error:error()}.
require_url(Name) ->
require(Name, envie@decode:url()).
-file("src/envie.gleam", 160).
?DOC(" Require a URL that has one of the given `schemes`.\n").
-spec require_url_with_scheme(binary(), list(binary())) -> {ok, gleam@uri:uri()} |
{error, envie@error:error()}.
require_url_with_scheme(Name, Schemes) ->
require(Name, envie@decode:url_with_scheme(Schemes)).
-file("src/envie.gleam", 168).
?DOC(" Shortcut for `require_url_with_scheme(name, [\"http\", \"https\"])`.\n").
-spec require_web_url(binary()) -> {ok, gleam@uri:uri()} |
{error, envie@error:error()}.
require_web_url(Name) ->
require(Name, envie@decode:web_url()).
-file("src/envie.gleam", 173).
?DOC(" Require a non-empty (trimmed) string.\n").
-spec require_non_empty_string(binary()) -> {ok, binary()} |
{error, envie@error:error()}.
require_non_empty_string(Name) ->
require(Name, envie@decode:non_empty_string()).
-file("src/envie.gleam", 178).
?DOC(" Require a string that starts with `prefix`.\n").
-spec require_string_prefix(binary(), binary()) -> {ok, binary()} |
{error, envie@error:error()}.
require_string_prefix(Name, Prefix) ->
require(Name, envie@decode:string_prefix(Prefix)).
-file("src/envie.gleam", 186).
?DOC(" Require a list of strings split by `separator`.\n").
-spec require_string_list(binary(), binary()) -> {ok, list(binary())} |
{error, envie@error:error()}.
require_string_list(Name, Separator) ->
require(Name, envie@decode:string_list(Separator)).
-file("src/envie.gleam", 194).
?DOC(" Require a list of integers split by `separator`.\n").
-spec require_int_list(binary(), binary()) -> {ok, list(integer())} |
{error, envie@error:error()}.
require_int_list(Name, Separator) ->
require(Name, envie@decode:int_list(Separator)).
-file("src/envie.gleam", 202).
?DOC(" Require a float variable.\n").
-spec require_float(binary()) -> {ok, float()} | {error, envie@error:error()}.
require_float(Name) ->
require(Name, envie@decode:float()).
-file("src/envie.gleam", 207).
?DOC(" Require a float within `[min, max]`.\n").
-spec require_float_range(binary(), float(), float()) -> {ok, float()} |
{error, envie@error:error()}.
require_float_range(Name, Min, Max) ->
require(Name, envie@decode:float_range(Min, Max)).
-file("src/envie.gleam", 216).
?DOC(" Require a boolean variable. Accepts the usual true/false aliases.\n").
-spec require_bool(binary()) -> {ok, boolean()} | {error, envie@error:error()}.
require_bool(Name) ->
require(Name, envie@decode:bool()).
-file("src/envie.gleam", 221).
?DOC(" Require a TCP/UDP port number (1–65535).\n").
-spec require_port(binary()) -> {ok, integer()} | {error, envie@error:error()}.
require_port(Name) ->
require(Name, envie@decode:port()).
-file("src/envie.gleam", 226).
?DOC(" Require that a variable equals one of the `allowed` strings.\n").
-spec require_one_of(binary(), list(binary())) -> {ok, binary()} |
{error, envie@error:error()}.
require_one_of(Name, Allowed) ->
require(Name, envie@decode:one_of(Allowed)).
-file("src/envie.gleam", 234).
?DOC(" Decode an optional variable: `Ok(None)` if missing, `Ok(Some(v))` if valid, otherwise `Error`.\n").
-spec optional(binary(), envie@decode:decoder(ECB)) -> {ok,
gleam@option:option(ECB)} |
{error, envie@error:error()}.
optional(Name, Decoder) ->
case get(Name) of
{error, nil} ->
{ok, none};
{ok, Value} ->
{decoder, Run} = Decoder,
_pipe = Run(Value),
_pipe@1 = gleam@result:map(
_pipe,
fun(Field@0) -> {some, Field@0} end
),
gleam@result:map_error(
_pipe@1,
fun(Reason) -> {invalid_value, Name, Value, Reason} end
)
end.
-file("src/envie.gleam", 289).
-spec do_load_from_string(binary(), boolean()) -> {ok, nil} |
{error, envie@error:load_error()}.
do_load_from_string(Content, Overwrite) ->
gleam@result:'try'(
begin
_pipe = envie@parse:parse_dotenv(Content),
gleam@result:map_error(
_pipe,
fun(Field@0) -> {parse_error, Field@0} end
)
end,
fun(Vars) ->
gleam@list:each(
Vars,
fun(Pair) ->
{Key, Value} = Pair,
case Overwrite of
true ->
set(Key, Value);
false ->
case get(Key) of
{ok, _} ->
nil;
{error, _} ->
set(Key, Value)
end
end
end
),
{ok, nil}
end
).
-file("src/envie.gleam", 271).
?DOC(" Load variables from `.env` formatted `content`; does not overwrite by default.\n").
-spec load_from_string(binary()) -> {ok, nil} |
{error, envie@error:load_error()}.
load_from_string(Content) ->
do_load_from_string(Content, false).
-file("src/envie.gleam", 276).
?DOC(" Load variables from `content`, overwriting existing variables.\n").
-spec load_from_string_override(binary()) -> {ok, nil} |
{error, envie@error:load_error()}.
load_from_string_override(Content) ->
do_load_from_string(Content, true).
-file("src/envie.gleam", 280).
-spec do_load_from(binary(), boolean()) -> {ok, nil} |
{error, envie@error:load_error()}.
do_load_from(Path, Overwrite) ->
gleam@result:'try'(
begin
_pipe = envie_ffi:read_file(Path),
gleam@result:replace_error(_pipe, {file_not_found, Path})
end,
fun(Content) -> do_load_from_string(Content, Overwrite) end
).
-file("src/envie.gleam", 256).
?DOC(" Load variables from `path`; existing environment variables are preserved.\n").
-spec load_from(binary()) -> {ok, nil} | {error, envie@error:load_error()}.
load_from(Path) ->
do_load_from(Path, false).
-file("src/envie.gleam", 251).
?DOC(" Load variables from `.env` in the current directory; does not overwrite existing vars.\n").
-spec load() -> {ok, nil} | {error, envie@error:load_error()}.
load() ->
load_from(<<".env"/utf8>>).
-file("src/envie.gleam", 266).
?DOC(" Load from `path`, overwriting existing variables.\n").
-spec load_override_from(binary()) -> {ok, nil} |
{error, envie@error:load_error()}.
load_override_from(Path) ->
do_load_from(Path, true).
-file("src/envie.gleam", 261).
?DOC(" Like `load`, but overwrite existing variables with `.env` values.\n").
-spec load_override() -> {ok, nil} | {error, envie@error:load_error()}.
load_override() ->
load_override_from(<<".env"/utf8>>).
-file("src/envie.gleam", 315).
?DOC(" Parse `.env` content into key/value pairs; returns parse errors if any.\n").
-spec parse_dotenv(binary()) -> {ok, list({binary(), binary()})} |
{error, list(envie@error:parse_error())}.
parse_dotenv(Content) ->
envie@parse:parse_dotenv(Content).
-file("src/envie.gleam", 324).
?DOC(" Format a single `Error` for display.\n").
-spec format_error(envie@error:error()) -> binary().
format_error(Err) ->
envie@error:format(Err).
-file("src/envie.gleam", 329).
?DOC(" Format multiple `Error` values, one per line.\n").
-spec format_errors(list(envie@error:error())) -> binary().
format_errors(Errors) ->
envie@error:format_all(Errors).
-file("src/envie.gleam", 334).
?DOC(" Format a `LoadError` for display.\n").
-spec format_load_error(envie@error:load_error()) -> binary().
format_load_error(Err) ->
envie@error:format_load_error(Err).