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