Advertisement
Guest User

Untitled

a guest
Oct 20th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.47 KB | None | 0 0
  1. defmodule Config do
  2. @moduledoc """
  3. This module handles fetching values from the config with some additional niceties
  4. """
  5.  
  6. @doc """
  7. Fetches a value from the config, or from the environment if {:system, "VAR"}
  8. is provided.
  9.  
  10. An optional default value can be provided if desired.
  11.  
  12. ## Example
  13.  
  14. iex> {test_var, expected_value} = System.get_env |> Enum.take(1) |> List.first
  15. ...> Application.put_env(:myapp, :test_var, {:system, test_var})
  16. ...> ^expected_value = #{__MODULE__}.get(:myapp, :test_var)
  17. ...> :ok
  18. :ok
  19.  
  20. iex> Application.put_env(:myapp, :test_var2, 1)
  21. ...> 1 = #{__MODULE__}.get(:myapp, :test_var2)
  22. 1
  23.  
  24. iex> :default = #{__MODULE__}.get(:myapp, :missing_var, :default)
  25. :default
  26. """
  27. @spec get(atom, atom, term | nil) :: term
  28. def get(app, key, default \\ nil) when is_atom(app) and is_atom(key) do
  29. case Application.get_env(app, key) do
  30. {:system, env_var} ->
  31. case System.get_env(env_var) do
  32. nil -> default
  33. val -> val
  34. end
  35. {:system, env_var, preconfigured_default} ->
  36. case System.get_env(env_var) do
  37. nil -> preconfigured_default
  38. val -> val
  39. end
  40. nil ->
  41. default
  42. val ->
  43. val
  44. end
  45. end
  46.  
  47. @doc """
  48. Same as get/3, but returns the result as an integer.
  49. If the value cannot be converted to an integer, the
  50. default is returned instead.
  51. """
  52. @spec get_integer(atom(), atom(), integer()) :: integer
  53. def get_integer(app, key, default \\ nil) do
  54. case get(app, key, nil) do
  55. nil -> default
  56. n when is_integer(n) -> n
  57. n ->
  58. case Integer.parse(n) do
  59. {i, _} -> i
  60. :error -> default
  61. end
  62. end
  63. end
  64.  
  65. @doc """
  66. Fetches a value from the config, or from the environment if {:system, "VAR"}
  67. is provided.
  68.  
  69. If the environment variable is not set and no preconfigured default is provided
  70. it will raise an ArgumentError
  71. """
  72. @spec get!(atom, atom) :: term | no_return
  73. def get!(app, key) when is_atom(app) and is_atom(key) do
  74. case Application.fetch_env!(app, key) do
  75. {:system, env_var} ->
  76. case System.get_env(env_var) do
  77. nil -> raise ArgumentError, message: "Environment variable #{env_var} not set"
  78. value -> value
  79. end
  80. {:system, env_var, preconfigured_default} ->
  81. case System.get_env(env_var) do
  82. nil -> preconfigured_default
  83. value -> value
  84. end
  85. val ->
  86. val
  87. end
  88. end
  89. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement