defmodule Sorcery.Specs.Portals do use Norm alias Sorcery.Specs.Primative, as: T def portal_ref(), do: spec(fn s -> case String.split(s, ":") do [_unique_ref, _tk] -> true _ -> false end end) def fun_atom(), do: T.atom() def guard(), do: one_of([ {fun_atom(), T.attr(), {:in, T.attr(), portal_ref()}}, {fun_atom(), T.attr(), {:in, T.attr(), coll_of(T.map())}}, {fun_atom(), T.attr(), T.any()} ]) def portal(), do: schema(%{ id: T.id, pid: T.pid(), tk: T.tk(), indices: spec(is_map()), guards: coll_of(guard()), resolved_guards: coll_of(guard()) }) def portal_presence(), do: schema(%{pid: T.pid(), portals: coll_of(portal())}) # %{tk_or_name => %{id => entity}} def assigned_portal(), do: T.db() end