Packages
cqrs_tools
0.3.13
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/documentation.ex
defmodule Cqrs.Documentation do
@moduledoc false
alias Cqrs.Documentation
defmacro option_docs(options) do
quote bind_quoted: [options: options] do
docs =
options
|> Enum.sort_by(&elem(&1, 0))
|> Enum.map(fn
{name, {:enum, possible_values}, opts} ->
default = Documentation.option_default(opts)
description = Documentation.option_description(opts)
values =
possible_values
|> Enum.map(&"`#{&1}`")
|> Enum.join(" | ")
"* `#{name}`: `:enum`.#{description}Possible values: #{values}. Defaults to `#{inspect(default)}`."
{name, hint, opts} ->
default = Documentation.option_default(opts)
description = Documentation.option_description(opts)
hint =
cond do
is_binary(hint) -> hint
true -> inspect(hint)
end
"* `#{name}` (#{hint}) - #{description}Defaults to `#{inspect(default)}`"
end)
if length(docs) > 0 do
"""
## Options
#{Enum.join(docs, "\n")}
"""
else
""
end
end
end
def option_default(opts) do
Keyword.get(opts, :default, "nil")
end
def option_description(opts) do
case Keyword.get(opts, :description) do
nil -> ""
desc -> " #{String.trim_trailing(desc, ".")}. "
end
end
defmacro query_binding_docs(bindings) do
quote do
docs =
Enum.map(unquote(bindings), fn {name, schema} ->
"""
* `#{name}` (#{inspect(schema)})
"""
end)
if length(docs) > 0 do
"""
## Named Bindings
#{docs}
"""
else
""
end
end
end
defmacro field_docs(title, fields, required_fields) do
quote bind_quoted: [title: title, fields: fields, required_fields: required_fields] do
{required_fields, optional_fields} =
Enum.split_with(fields, fn {name, _type, _opts} ->
Enum.member?(required_fields, name)
end)
required_field_docs = Documentation.__fields_docs__(required_fields, "Required")
optional_field_docs = Documentation.__fields_docs__(optional_fields, "Optional")
"""
## #{title}
#{required_field_docs}
#{optional_field_docs}
"""
end
end
defmacro __fields_docs__(fields, title) do
quote do
field_docs =
unquote(fields)
|> Enum.reject(fn {_name, _type, opts} -> Keyword.get(opts, :internal, false) end)
|> Enum.sort_by(&elem(&1, 0))
|> Enum.map(fn {name, type, opts} ->
description =
case Keyword.get(opts, :description) do
nil -> ""
desc -> ". " <> String.trim_trailing(desc, ".") <> "."
end
field_type =
case type do
Ecto.Enum -> opts |> Keyword.fetch!(:values) |> Enum.join(" | ")
type when is_tuple(type) -> inspect(type)
_ -> type
end
defaults =
case Keyword.get(opts, :default) do
nil -> nil
default -> "Defaults to `#{inspect(default)}`."
end
"""
* `#{name}` (#{field_type})#{description} #{defaults}
"""
end)
if length(field_docs) > 0 do
"""
### #{unquote(title)}
#{field_docs}
"""
end
end
end
end