defmodule Constants do
#
# See: https://gist.github.com/smpallen99/9995893
#
defmacro constant(name, value) do
quote do
defmacro unquote(name), do: unquote(value)
end
end
# this is the macro used to define
# compile time constants
defmacro define(name, value) do
quote do
constant(unquote(name), unquote(value))
end
end
# Support for "use Constants"
# https://hexdocs.pm/elixir/Kernel.html#use/2
defmacro __using__(_opts) do
quote do
import Constants
end
end
end
defmodule Module1 do
use Constants
define(var1, "fdsafds")
define(var2, "222")
define(var3, "333")
end
defmodule Module2 do
require Module1
def run(some_var) do
case some_var do
Module1.var1() ->
IO.puts("var1")
Module1.var2() ->
IO.puts("var2")
Module1.var3() ->
IO.puts("var3")
end
end
end
Module2.run("fdsafds")
Module2.run("222")
Module2.run("333")
or
defmodule Constants do
defmacro constant(name, value) do
quote bind_quoted: [name: name, value: value] do
defmacro unquote(name)(), do: unquote(value)
end
end
defmacro __using__(_opts) do
quote do
import Constants
end
end
end
defmodule Module1 do
use Constants
@consts [var1: "fdsafds", var2: "222", var3: "333"]
for {name, value} <- @consts,
do: constant(name, value)
end
defmodule Module2 do
require Module1
def run(some_var) do
case some_var do
Module1.var1() ->
IO.puts("var1")
Module1.var2() ->
IO.puts("var2")
Module1.var3() ->
IO.puts("var3")
end
end
end
Module2.run("fdsafds")
Module2.run("222")
Module2.run("333")