I also posted about it on Elixir Forum: https://elixirforum.com/t/enviable-robust-environment-variable-conversion/69360
On Tue, Feb 18, 2025 at 3:16 PM Austin Ziegler <halosta...@gmail.com> wrote: > I recently moved to a new position where we use Dotenvy and > `System.get_env!` etc. I developed > https://hexdocs.pm/enviable/Enviable.html on my own time and have > released it. It's fairly comprehensive—and by fairly I mean extremely—and > if there's something missing, I'm open to both requests and pull requests. > > It supports: > > - boolean > - integer > - float > - atom (and safe atom) also with constraints > - module (and safe module) also with constraints > - Elixir and Erlang code evaluation > - PEM decoding > - baseX decoding (and subsequent casting if required) > - list splitting (and subsequent casting) > > I'm sure I’m missing something. > > We aren't using it at work yet, but the team is looking forward to when we > have a bit of breathing room to make this happen. > > -a > > On Tue, Feb 18, 2025 at 11:31 AM Zach Daniel <zachary.s.dan...@gmail.com> > wrote: > >> Hm…that makes sense. I’d maintain that it should end in a `!` for clarity >> though, even if there is no non-raising variant. >> >> On Feb 18, 2025, at 11:28 AM, dave.lu...@gmail.com < >> dave.lucia....@gmail.com> wrote: >> >> > I think a simpler alternative to an `as` option might be: >> >> > `System.get_boolean_env/1` and `System.get_integer_env/1` that return >> things like: >> >> > `{:invalid, value}` when the value can’t be parsed, but provide ! >> versions that raise errors, i.e >> >> I do aree with type specific functions, but I don't agree with adding >> non-raising variants as this is intended to be an ergonomic improvement to >> existing usage patterns. If the value is not parseable, it should raise. If >> you have a more complex usage pattern, use the existing `System.get_env/2` >> and do your own parsing >> >> On Tuesday, February 18, 2025 at 11:18:48 AM UTC-5 zachary....@gmail.com >> wrote: >> >>> I think a simpler alternative to an `as` option might be: >>> >>> `System.get_boolean_env/1` and `System.get_integer_env/1` that return >>> things like: >>> >>> `{:invalid, value}` when the value can’t be parsed, but provide ! >>> versions that raise errors, i.e >>> >>> ```elixir >>> config :something, port: System.get_integer_env!(“SERVER_PORT”) >>> ``` >>> >>> Raising something like >>> >>> ```elixir >>> Expected SERVER_PORT to be an integer, got <something> >>> ``` >>> >>> On Feb 18, 2025, at 11:15 AM, Cocoa Xu <i...@uwucocoa.moe> wrote: >>> >>> This would be quite helpful to deal with environment variables that are >>> expected to be boolean or integers. In my experience, I always have to >>> copy-paste a helper function to do the type cast: >>> >>> defp to_boolean(nil), do: false >>> >>> defp to_boolean(var) when is_boolean(var) do >>> var >>> end >>> >>> defp to_boolean(var) do >>> String.downcase(to_string(var)) in ["1", "true", "on", "yes", "y"] >>> end >>> >>> >>> On Tuesday, February 18, 2025 at 5:07:50 PM UTC+1 dave.lu...@gmail.com >>> wrote: >>> >>>> In Elixir applications, config/runtime.exs is often used to parse >>>> environment variables from System.get_env2/ and friends, and convert into >>>> Application configuration. >>>> >>>> Since environment variables can only be strings, it is often necessary >>>> to cast from string values into booleans and integer values. E.g. >>>> >>>> config :my_app, :bool_value, System.get_env("BOOL_VALUE") == "true" >>>> >>>> config :my_app, :int_value, >>>> String.to_string(System.get_env("INT_VALUE", "5")) >>>> >>>> While there are entire libraries that deal with advanced runtime >>>> configuration, like Vapor <https://github.com/elixir-toniq/vapor> and >>>> elixir-specify <https://github.com/Qqwy/elixir-specify>, I believe >>>> there is an opportunity to simplify common patterns and duplicative code in >>>> Elixir configuration that often leads to confusion and edge case issues. >>>> >>>> My proposal is to add parsing for both booleans and integers to >>>> environment variable parsing. As an example: >>>> >>>> config :my_app, :bool_value, System.get_env_as!("BOOL_VALUE", "false", >>>> as: :boolean) >>>> >>>> config :my_app, :int_value, System.get_env_as!("INT_VALUE", "5", as: >>>> :integer) >>>> >>>> The trickiness would be in the acceptable range of edge case values. >>>> For example, "1" and "0" are often used for boolean values, in addition to >>>> "TRUE" and "FALSE". I believe there could be a reasonable compromise and >>>> appropriate documentation for addressing these issues. >>>> >>>> More complex parsing, such as floats and custom data types would not be >>>> supported. >>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "elixir-lang-core" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to elixir-lang-co...@googlegroups.com. >>> To view this discussion visit >>> https://groups.google.com/d/msgid/elixir-lang-core/562c5949-fde0-4f3d-9357-d57aa1f9d4b3n%40googlegroups.com >>> <https://groups.google.com/d/msgid/elixir-lang-core/562c5949-fde0-4f3d-9357-d57aa1f9d4b3n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >>> >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to elixir-lang-core+unsubscr...@googlegroups.com. >> To view this discussion visit >> https://groups.google.com/d/msgid/elixir-lang-core/f3bdb53b-d44b-4559-8cc6-9cdcb203c513n%40googlegroups.com >> <https://groups.google.com/d/msgid/elixir-lang-core/f3bdb53b-d44b-4559-8cc6-9cdcb203c513n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to elixir-lang-core+unsubscr...@googlegroups.com. >> To view this discussion visit >> https://groups.google.com/d/msgid/elixir-lang-core/A281A8D1-A3EB-43B7-AB76-9B8863DD32D6%40gmail.com >> <https://groups.google.com/d/msgid/elixir-lang-core/A281A8D1-A3EB-43B7-AB76-9B8863DD32D6%40gmail.com?utm_medium=email&utm_source=footer> >> . >> > > > -- > Austin Ziegler • halosta...@gmail.com • aus...@halostatue.ca > http://www.halostatue.ca/ • http://twitter.com/halostatue > -- Austin Ziegler • halosta...@gmail.com • aus...@halostatue.ca http://www.halostatue.ca/ • http://twitter.com/halostatue -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/elixir-lang-core/CAJ4ekQuLVyqBAO9Z9XRZD5JK2_tOFSg3jG8bz9DB7m-QcPc2DA%40mail.gmail.com.