zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

writer.ex (2230B)


      1 defmodule Absinthe.Plug.DocumentProvider.Compiled.Writer do
      2   @moduledoc false
      3 
      4   defmacro write(env) do
      5     [
      6       quoted_compiled_lookups(env),
      7       quoted_source_lookups(env),
      8       quoted_lookup_fallthrough(),
      9       quoted_pipeline_tools()
     10     ]
     11   end
     12 
     13   @doc false
     14   def error_message(id, module, messages) do
     15     messages = List.wrap(messages)
     16 
     17     "\n\n" <>
     18       """
     19       Could not compile document provider #{module}.
     20 
     21       The following problems were found processing document "#{id}":
     22       """ <> Enum.join(Enum.map(messages, &"  - #{&1}"), "\n") <> "\n"
     23   end
     24 
     25   @spec quoted_compiled_lookups(Macro.Env.t()) :: Macro.t()
     26   defp quoted_compiled_lookups(env) do
     27     docs = Module.get_attribute(env.module, :absinthe_documents_to_compile)
     28     compilation_pipeline = Module.get_attribute(env.module, :compilation_pipeline)
     29 
     30     for {id, document_text} <- docs do
     31       pipeline =
     32         compilation_pipeline ++
     33           [
     34             {Absinthe.Plug.DocumentProvider.Compiled.Check, id: id, module: env.module}
     35           ]
     36 
     37       case Absinthe.Pipeline.run(document_text, pipeline) do
     38         {:ok, result, _} ->
     39           document = Macro.escape(result)
     40 
     41           quote do
     42             def __absinthe_plug_doc__(:compiled, unquote(id)), do: unquote(document)
     43           end
     44 
     45         {:error, message, _} ->
     46           raise error_message(id, env.module, message)
     47       end
     48     end
     49   end
     50 
     51   @spec quoted_source_lookups(Macro.Env.t()) :: Macro.t()
     52   defp quoted_source_lookups(env) do
     53     docs = Module.get_attribute(env.module, :absinthe_documents_to_compile)
     54 
     55     for {id, document_text} <- docs do
     56       quote do
     57         def __absinthe_plug_doc__(:source, unquote(id)), do: unquote(document_text)
     58       end
     59     end
     60   end
     61 
     62   @spec quoted_lookup_fallthrough() :: Macro.t()
     63   defp quoted_lookup_fallthrough() do
     64     quote do
     65       def __absinthe_plug_doc__(_, _), do: nil
     66     end
     67   end
     68 
     69   @spec quoted_pipeline_tools() :: Macro.t()
     70   defp quoted_pipeline_tools() do
     71     quote do
     72       def __absinthe_plug_doc__(:remaining_pipeline) do
     73         @compilation_pipeline
     74         |> List.last()
     75         |> case do
     76           {mod, _} ->
     77             mod
     78 
     79           mod ->
     80             mod
     81         end
     82       end
     83     end
     84   end
     85 end