Current section
Files
Jump to
Current section
Files
priv/templates/mandarin.gen.auth/mandarin_web.ex
defmodule <%= inspect context.mandarin_web_module %> do
@moduledoc """
The entrypoint for defining the web interface to your Mandarin contexts,
such as controllers, views, channels and so on.
This module is analogous to the `YourAppWeb` module defined
by the Phoenix generators.
Mandarin, unlike Phoenix, implements a "vertical" folder structure
which keeps controllers, views and templates together in the same file.
This can be used in your application as:
use <%= install.mandarin_web_module %>, :controller
use <%= install.mandarin_web_module %>, :view
Do NOT define functions inside the quoted expressions
below. Instead, define any helper function in modules
and import those modules here.
"""
def controller(opts) do
ns = Keyword.fetch!(opts, :namespace)
quote do
use Phoenix.Controller,
namespace: unquote(ns)
import Plug.Conn
import <%= inspect context.web_module %>.Gettext
alias <%= inspect context.web_module %>.Router.Helpers, as: Routes
end
end
def view(opts) do
ns = Keyword.fetch!(opts, :namespace)
quote do
use Phoenix.View,
root: "#{__DIR__}/templates",
namespace: unquote(ns),
path: ""
# Import convenience functions from controllers
import Phoenix.Controller,
only: [get_flash: 1, get_flash: 2, view_module: 1, view_template: 1]
# Include shared imports and aliases for views
unquote(view_helpers(opts))
end
end
def live_view(opts) do
quote do
use Phoenix.LiveView,
layout: {<%= inspect context.web_module %>.LayoutView, "live.html"}
unquote(view_helpers(opts))
end
end
def live_component(opts) do
quote do
use Phoenix.LiveComponent
unquote(view_helpers(opts))
end
end
def router(_opts) do
quote do
use Phoenix.Router
import Plug.Conn
import Phoenix.Controller
import Phoenix.LiveView.Router
end
end
def channel(_opts) do
quote do
use Phoenix.Channel
import <%= inspect context.web_module %>.Gettext
end
end
defp view_helpers(_opts) do
quote do
# Use all HTML functionality (forms, tags, etc)
use Phoenix.HTML
import Phoenix.HTML.Tag
# Import LiveView helpers (live_render, live_component, live_patch, etc)
import Phoenix.LiveView.Helpers
# Import basic rendering functionality (render, render_layout, etc)
import Phoenix.View
import <%= inspect context.web_module %>.ErrorHelpers
import <%= inspect context.web_module %>.Gettext
alias <%= inspect context.web_module %>.Router.Helpers, as: Routes
end
end
@doc """
When used, dispatch to the appropriate controller/view/etc.
"""
defmacro __using__(which, opts \\ []) when is_atom(which) do
default_ns = namespace_from_module(__CALLER__.module)
ns = Keyword.get(opts, :namespace, default_ns)
params = [namespace: ns]
apply(__MODULE__, which, [params])
end
# Helpers (kept here to keep the file self-contained
# without runtime dependencies on Mandarin)
defp namespace_from_module(module) do
module
|> Module.split()
|> Enum.drop(-1)
|> Module.concat()
end
end