-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/1, load/0, load_override_from/1, load_override/0, load_from_string/1, load_from_string_override/1, 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(DUV)) -> {ok, DUV} | {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(DWH)) -> {ok, gleam@option:option(DWH)} | {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", 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", 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", 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).