Packages
maru
0.11.3
0.14.0-pre.1
0.13.2
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
REST-like API micro-framework for elixir inspired by grape.
Current section
Files
Jump to
Current section
Files
lib/maru/builder/mount_link.ex
defmodule Maru.Builder.MountLink do
@name :maru_mount_link
@doc """
Create ets table to storage mount link.
"""
def start do
:ets.new(@name, [:set, :public, :named_table])
:ok
end
@doc """
Link a router module to who mounted it.
"""
def put_father(module1, module2) do
father =
[ module2 |
case :ets.lookup(@name, module1) do
[{^module1, value}] -> value
[] -> []
end
]
:ets.insert(@name, {module1, father})
end
@doc """
Get router module mounted on another.
"""
def get_father(module) do
case :ets.lookup(@name, module) do
[{^module, value}] -> value
[] -> []
end
end
@doc """
Get mount link of a router module.
"""
def get_mount_link(module, fathers) do
do_get_mount_link(module, fathers, [module])
end
defp do_get_mount_link(module, fathers, result) do
case get_father(module) do
[] -> result |> Enum.reverse
[father] ->
do_get_mount_link(father, fathers, [father | result])
[_ | _]=linked ->
case Enum.find(linked, fn(router) -> router in fathers end) do
nil ->
tested_module = Enum.at(result, -1) |> Module.split |> Enum.join(".")
first_linked_module = List.first(linked) |> Module.split |> Enum.join(".")
linked_module =
Enum.map(linked, fn(module) ->
module |> Module.split |> Enum.join(".")
end) |> Enum.join(", ")
raise """
Your tested module #{tested_module} mounted to #{linked_module}.
You must decided which branch should be used for test like this:
use Maru.Test, for: #{first_linked_module} |> #{tested_module}
"""
father -> do_get_mount_link(father, fathers, [father | result])
end
end
end
end