Packages
croma
0.6.0
0.13.0
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
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.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.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.11
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
Elixir macro utilities to make type-based programming easier
Current section
Files
Jump to
Current section
Files
lib/croma/guard.ex
defmodule Croma.Guard do
@moduledoc """
Module to work with guard generation (see `Croma.Defun.defun/2`).
This module is intended for internal use.
"""
def make(type_expr, v, caller) do
case type_expr do
{_, _} -> quote do: is_tuple(unquote(v)) # tuple with two elements
l when is_list(l) -> quote do: is_list(unquote(v))
{first, _, _} -> make_from_tuple3(type_expr, v, caller, first)
_ -> error(type_expr)
end
end
defp make_from_tuple3(type_expr, v, caller, first) do
case first do
:integer -> quote do: is_integer(unquote(v))
:pos_integer -> quote do: is_integer(unquote(v)) and unquote(v) > 0
:neg_integer -> quote do: is_integer(unquote(v)) and unquote(v) < 0
:non_neg_integer -> quote do: is_integer(unquote(v)) and unquote(v) >= 0
:boolean -> quote do: is_boolean(unquote(v))
:byte -> quote do: is_integer(unquote(v)) and (unquote(v) in 0..255)
:char -> quote do: is_integer(unquote(v)) and (unquote(v) in 0..0x10ffff)
:float -> quote do: is_float(unquote(v))
:number -> quote do: is_number(unquote(v))
:binary -> quote do: is_binary(unquote(v))
:bitstring -> quote do: is_bitstring(unquote(v))
:module -> quote do: is_atom(unquote(v)) or is_tuple(unquote(v))
:atom -> quote do: is_atom(unquote(v))
:node -> quote do: is_atom(unquote(v))
:fun -> quote do: is_function(unquote(v))
:pid -> quote do: is_pid(unquote(v))
:port -> quote do: is_port(unquote(v))
:reference -> quote do: is_reference(unquote(v))
:char_list -> quote do: is_list(unquote(v))
:list -> quote do: is_list(unquote(v))
:map -> quote do: is_map(unquote(v))
:tuple -> quote do: is_tuple(unquote(v))
:%{} -> quote do: is_map(unquote(v))
:{} -> quote do: is_tuple(unquote(v))
:<<>> -> quote do: is_bitstring(unquote(v))
{:., _, [alias_, basename]} -> make_with_simplify(type_expr, v, caller, alias_, basename)
_ -> error(type_expr)
end
end
defp make_with_simplify(type_expr, v, caller, alias_, basename) do
mod = Macro.expand(alias_, caller)
case Croma.TypeUtil.resolve_primitive(mod, basename) do
{:ok, primitive_type} -> make_from_tuple3(type_expr, v, caller, primitive_type)
:error -> error(type_expr)
end
end
defp error(type_expr) do
raise "cannot generate guard for the given type: #{Macro.to_string(type_expr)}"
end
end