Skip to content

Instantly share code, notes, and snippets.

@jorgevilaca82
Created December 6, 2023 20:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jorgevilaca82/334787b75a005f57056f8913eb7b65a9 to your computer and use it in GitHub Desktop.
Save jorgevilaca82/334787b75a005f57056f8913eb7b65a9 to your computer and use it in GitHub Desktop.
Elixir service module switcher
defmodule ServiceSwitcher do
defmacro __using__(opts \\ []) do
service_module_mapping = opts[:service_module_mapping]
quote do
@service_module_mapping unquote(service_module_mapping)
@services Keyword.keys(@service_module_mapping)
def get_service_module(service) when is_binary(service),
do: service |> String.to_atom() |> get_service_module()
def get_service_module(service) when service in @services do
{:ok, @service_module_mapping[service]}
end
def get_service_module(_), do: {:error, :no_service_module_for_service}
end
end
end
defmodule ServiceOne do
def execute(params) do
IO.inspect(params)
IO.puts("ServiceOne executed")
end
end
defmodule ServiceTwo do
def execute(params) do
IO.inspect(params)
IO.puts("ServiceTwo executed")
end
end
defmodule MyService do
use ServiceSwitcher,
service_module_mapping: [
{:service_one, ServiceOne},
{:service_two, ServiceTwo}
]
def execute(service, params \\ []) do
with {:ok, service_module} <- get_service_module(service) do
apply(service_module, :execute, [params])
end
end
end
MyService.execute(:service_one, "hello")
MyService.execute("service_one", "hello")
MyService.execute(:service_two, "hello")
MyService.execute("service_two", "hello")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment