Current section
Files
Jump to
Current section
Files
lib/permit_absinthe/schema/meta.ex
defmodule Permit.Absinthe.Schema.Meta do
@moduledoc """
This module provides a way to extract meta information from a field's return type in a resolver.
*Part of the private API and not meant for public use.*
"""
# Helper function to recursively unwrap type wrappers (List, NonNull) to get the base type identifier
defp unwrap_type(%{of_type: inner_type}), do: unwrap_type(inner_type)
defp unwrap_type(type), do: type
@doc """
Extracts meta information from a field's return type in a resolver.
## Examples
def resolve_article(_, _, resolution) do
meta = get_type_meta_from_resolution(resolution)
# meta will contain %{schema: Blog.Content.Article}
# ...
end
"""
def get_type_meta_from_resolution(resolution, meta_keys) when is_list(meta_keys) do
case resolution do
%{definition: %{schema_node: schema_node}, schema: schema} ->
# Recursively unwrap List and NonNull wrappers to get the base type identifier
type_ref = unwrap_type(schema_node.type)
type = schema.__absinthe_type__(type_ref)
case type do
%{__private__: private} when not is_nil(private) ->
get_in(private[:meta] || [], meta_keys)
_ ->
nil
end
_ ->
nil
end
end
def get_type_meta_from_resolution(resolution, meta_key) when is_atom(meta_key) do
get_type_meta_from_resolution(resolution, [meta_key])
end
def get_field_meta_from_resolution(resolution, meta_keys) when is_list(meta_keys) do
meta = resolution.definition.schema_node.__private__[:meta] || []
get_in(meta, meta_keys)
end
def get_field_meta_from_resolution(resolution, meta_key) when is_atom(meta_key) do
get_field_meta_from_resolution(resolution, [meta_key])
end
def get_type_name(resolution) do
case resolution do
%{definition: %{schema_node: schema_node}} -> unwrap_type(schema_node.type)
_ -> nil
end
end
end