GtBridge.View (gt_bridge v0.17.1)

Copy Markdown View Source

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

defview(arg, list)

(macro)

determine_constraining_arg(arg1, arg2)

@spec determine_constraining_arg(Macro.t(), Macro.t()) :: Macro.t()

get_view_object(object, server \\ GtBridge.Views)

@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.

get_view_specs(object, module, server \\ GtBridge.Views)

match_arg(x, caller)

@spec match_arg(Macro.t(), Macro.Env.t()) :: module() | nil

match_view_argument(list, caller)

@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:

  1. 3 tuples, are not supported as it overlaps with Macro.t/0.
  2. Atoms are not supports, as it overlaps with x = y

match_view_argument_to_module(args, env)

@spec match_view_argument_to_module(Macro.t(), Macro.Env.t()) :: module()

register(module, server \\ GtBridge.Views)

@spec register(module(), GenServer.server()) :: :ok

Register all views defined in module into the given server.

register_all(server \\ GtBridge.Views)

@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.