Packages
mazurka
0.3.3
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
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.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.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
hypermedia api toolkit
Current section
Files
Jump to
Current section
Files
lib/mazurka/resource/condition.ex
defmodule Mazurka.Resource.Condition.Failure do
defexception [:message]
end
defmodule Mazurka.Resource.Condition do
defmacro condition(block, error_handler \\ nil)
defmacro condition([do: block], error_handler) do
Mazurka.Compiler.Utils.register(__MODULE__, block, error_handler)
end
defmacro condition(block, error_handler) do
Mazurka.Compiler.Utils.register(__MODULE__, block, error_handler)
end
def compile(conditions, _env) do
conditions
end
def compile_fatal(conditions) do
compile_type(conditions, :fatal)
end
def compile_silent(conditions) do
compile_type(conditions, :silent)
end
defp compile_type(conditions, type) do
conditions = Enum.map(conditions || [], &(handle_condition(&1, type)))
quote do
conditions = unquote(conditions)
^Mazurka.Resource.Condition.handle_error(conditions)
end
end
defp handle_condition({block, {error_handler, _, _}}, type) when is_atom(error_handler) do
compile_condition(block, error_handler, type)
end
defp handle_condition({block, nil}, type) do
compile_condition(block, :error, type)
end
defp compile_condition(block, error_handler, :fatal) do
code = Macro.to_string(block)
message = "Condition failure of #{inspect(code)}"
quote do
condition = unquote(block)
if !condition do
error = %Mazurka.Resource.Condition.Failure{message: unquote(message)}
message = %__MODULE__.unquote(error_handler){error: error}
%Mazurka.Resource.Error{
message: message
}
end
end
end
defp compile_condition(block, _, :silent) do
quote do
condition = unquote(block)
if !condition do
true
end
end
end
def generic_error(_) do
end
def handle_error(errors) do
Enum.find(errors, fn
(nil) -> false
(_) -> true
end)
end
end