Helper macros for declaring Phlow views on typed structs.
Use use GtBridge.View in your struct module and define views
using defview/2. The collected views can later be registered
in a GtBridge.Views GenServer with register/2.
Example
defmodule MyStruct do
use TypedStruct
use GtBridge.View
typedstruct do
field(:items, list(), default: [])
end
defview list_view(self, builder) do
builder.list()
|> GtBridge.Phlow.List.title("Items")
|> GtBridge.Phlow.List.priority(1)
|> GtBridge.Phlow.List.items(fn -> self.items end)
end
end
Summary
Functions
Get all view specifications for a given object by calling its registered views. Returns a list of dictionaries ready for serialization to GT.
I handle matching arguments to resolve the module for defview/1.
Register all views defined in module into the given server.
I scan all loaded modules for __views__/0 and register them.
Functions
@spec get_view_object(any(), GenServer.server()) :: [map()]
Get all view specifications for a given object by calling its registered views. Returns a list of dictionaries ready for serialization to GT.
@spec match_arg(Macro.t(), Macro.Env.t()) :: module() | nil
@spec match_view_argument(Macro.t(), Macro.Env.t()) :: module() | nil
I handle matching arguments to resolve the module for defview/1.
Most data structures will resolve however there are a few exceptions:
- 3 tuples, are not supported as it overlaps with
Macro.t/0. - Atoms are not supports, as it overlaps with
x = y
@spec match_view_argument_to_module(Macro.t(), Macro.Env.t()) :: module()
@spec register(module(), GenServer.server()) :: :ok
Register all views defined in module into the given server.
@spec register_all(GenServer.server()) :: :ok
I scan all loaded modules for __views__/0 and register them.
The @after_compile hooks that defview generates fire during
compilation, before the Views GenServer is started, so they fail
silently. Call me after the application starts to pick up any
views that were missed.