Packages
cqrs_tools
0.2.23
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.30
0.2.29
0.2.28
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.1
0.1.0
A collection of handy Elixir macros for CQRS applications.
Current section
Files
Jump to
Current section
Files
lib/cqrs/bounded_context/commanded.ex
if Code.ensure_loaded?(Commanded) do
defmodule Cqrs.BoundedContext.Commanded do
@moduledoc """
If you are a `Commanded` user, you have already registered your commands with your commanded routers.
Instead of repeating yourself, you can cut down on boilerplate with the `import_commands/1` macro.
defmodule Users do
use Cqrs.BoundedContext
use Cqrs.BoundedContext.Commanded
import_commands CommandedRouter
query GetUser
end
"""
alias Cqrs.{BoundedContext, Guards}
defmacro __using__(_) do
quote do
import Cqrs.BoundedContext.Commanded, only: :macros
end
end
@doc """
Imports all of a [Command Router's](`Commanded.Commands.Router`) registered commands.
## Options
* `:only` - Restrict importing to only the commands listed
* `:except` - Imports commands except those listed
* `:after` - a list of function names and a function of one arity to run with the execution result
### Example
import_commands Example.Users.Router,
except: [CreateUser],
after: [
reinstate_user: &AfterExecution.load_user/1,
suspend_user: &AfterExecution.load_user/1
]
"""
defmacro import_commands(router, opts \\ []) do
quote do
Guards.ensure_is_commanded_router!(unquote(router))
only = Keyword.get(unquote(opts), :only, [])
except = Keyword.get(unquote(opts), :except, [])
commands = unquote(router).__registered_commands__()
commands =
case {only, except} do
{[], []} -> commands
{[], except} -> Enum.reject(commands, &Enum.member?(except, &1))
{only, []} -> Enum.filter(commands, &Enum.member?(only, &1))
_ -> raise "You can only specify :only or :except"
end
Enum.map(commands, fn module -> BoundedContext.command(module, unquote(opts)) end)
end
end
end
end